如果存在则插入仅在表中有记录时才有效
Posted
技术标签:
【中文标题】如果存在则插入仅在表中有记录时才有效【英文标题】:Insert if exists only works if there are records in table 【发布时间】:2016-04-18 09:05:59 【问题描述】:我使用以下查询仅在表不存在时将记录插入到表中:
INSERT INTO tblExample (exampleColumn)
SELECT 'test' FROM tblExample
WHERE NOT EXISTS (SELECT 1 FROM tblExample where exampleColumn = 'test');
只要表中至少有 1 条记录,它就可以正常工作。如果没有记录,则不会将记录插入表中。
谁能看到我的查询有什么问题?
谢谢!
【问题讨论】:
如预期的那样,如果您的表中没有行,则选择将返回 0 行! 谢谢@jarlh。您能否提出改进建议以实现我的目标? 您使用的是哪个 dbms?你们有单排桌子吗? 我正在使用 Apache Derby。 我会尝试类似:insert into tblExample select * from ( values 'test') t WHERE NOT EXISTS (SELECT 1 FROM tblExample where exampleColumn = 'test');
【参考方案1】:
使用 Derby 10.12 测试
INSERT INTO tblExample (exampleColumn)
SELECT *
from (values ('test')) as x(col)
WHERE NOT EXISTS (SELECT 1
FROM tblExample t
where t.exampleColumn = x.col);
【讨论】:
【参考方案2】:试试这个,
INSERT INTO tblExample (exampleColumn)
SELECT Value FROM ( SELECT 'test' Value) T1
WHERE NOT EXISTS (SELECT 1 FROM tblExample where exampleColumn = 'test')
或者你可以使用这个
INSERT INTO tblExample (exampleColumn)
SELECT Value FROM ( SELECT 'test' Value) T1
LEFT JOIN tblExample ON exampleColumn = Value
WHERE exampleColumn IS NULL
【讨论】:
嗨@Abdul Rasheed,我喜欢你的第一个答案,但看起来 JDBC / Apache Derby 不支持你的别名语法。【参考方案3】:查询是:
INSERT INTO user (id, name, date)
SELECT 23,test,DATE('2013-02-12')
FROM contact
WHERE NOT EXISTS ( SELECT 1 FROM user WHERE id = 23 )
【讨论】:
【参考方案4】:感谢您的帮助。我发现如果记录不存在(即使表中没有记录),添加记录的最佳方法是使用以下语句:
INSERT INTO tblExample(exampleColumn)
(SELECT 'test' FROM tblExample WHERE exampleColumn='test' HAVING COUNT(*)=0);
【讨论】:
【参考方案5】:如果表中没有记录,您的第一个查询 "SELECT 'test' FROM tblExample" 将返回 0 行。
使用下面的代码。
IF NOT EXISTS(SELECT * FROM tblExample where exampleColumn='test')
insert into tblExample(exampleColumn) values ('test')
【讨论】:
这是更大声明的一部分吗?用 'if not' 开始一条 sql 语句似乎不是有效的语法 是的,sql语句中可以有“EXISTS”和“NOT EXISTS”。 这不是一个有效的语句(在 derby 中):错误 42X01:语法错误:在第 1 行第 1 列遇到“IF”。以上是关于如果存在则插入仅在表中有记录时才有效的主要内容,如果未能解决你的问题,请参考以下文章