如果存在则插入仅在表中有记录时才有效

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”。

以上是关于如果存在则插入仅在表中有记录时才有效的主要内容,如果未能解决你的问题,请参考以下文章

mysql:如果不存在则插入记录,否则返回记录的ID

仅当记录不存在时才将 SQL 插入表中[重复]

如果 iPhone 应用程序中不存在,则在表中插入记录

如果不存在则插入数据的过程pl sql

在表中插入记录之前/之后删除旧记录,记录数> 2

如果 mysql 数据库中的表中不存在,则更新或插入多条记录