【问题标题】: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');

标签: sql database jdbc derby


【解决方案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”。
        猜你喜欢
        • 1970-01-01
        • 2019-11-22
        • 2014-03-08
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-31
        相关资源
        最近更新 更多