INSERT语句,用于检查是否已存在等效行

时间:2012-05-17 14:07:20

标签: mysql sql

在MySQL数据库中,我有一个表test,其中有两列foobar。我正在尝试编写单个SQL语句,只有当这样的行不存在时才插入行。我已尝试过以下操作,但如果表为空则无效:

INSERT INTO test (foo, bar) 
SELECT 'foo', 'bar'
FROM test
WHERE NOT EXISTS  
(SELECT 1 FROM test WHERE foo = 'foo' AND bar = 'bar')
LIMIT 1;

5 个答案:

答案 0 :(得分:2)

测试表为空,因此Select中不会有任何记录。因此,请将Dual表与Select一起使用。

    INSERT INTO test (foo, bar) 
    SELECT 'foo', 
           'bar' 
    From DUAL
    WHERE  NOT EXISTS (SELECT 1 
                       FROM   test  
                       WHERE  foo = 'foo' 
                              AND bar = 'bar') 

DUAL纯粹是为了方便那些要求所有SELECT语句应该包含FROM和其他条款的人。 MySQL可能会忽略这些子句。如果没有引用表,MySQL不需要FROM DUAL

答案 1 :(得分:2)

EXISTS子句不必引用您选择的表,并且因为您只在SELECT中使用外部引用作为insert语句,所以您可以使用任何表来选择从实际上你甚至不需要使用具体的表格,例如

INSERT INTO Test
SELECT  'foo', 'bar'
FROM    DUAL
WHERE   NOT EXISTS (SELECT 1 FROM test WHERE foo = 'foo' AND bar = 'bar');

Example SQL Fiddle

答案 2 :(得分:1)

你有没有试过像:

SELECT      'foo'
            , 'bar'
WHERE       1 NOT IN  (
                SELECT  CASE WHEN COUNT(*) < 1
                            THEN 0
                            ELSE 1
                        END
                FROM    test
                WHERE   foo = 'foo'
                        AND bar = 'bar'
            )

请注意删除LIMIT 1(我认为LIMIT 1不会受到影响,但我不认为这有助于子句在子查询之外。

请注意以上内容已经过测试,适用于空表。

此外,对于上述IN是必需的,如果返回非空集(或{{1}的空集),则EXISTS不会EXISTS返回true })。

答案 3 :(得分:0)

我认为您不能从插入的同一个表中插入结果集并检查该行是否存在。

无论如何,如果没有,我想这是一个解决方法:

INSERT INTO test t1 (foo, bar) 
ON DUPLICATE KEY update t1.foo=t2.foo;

编辑:在您的原始查询中,我认为您正在从select语句执行插入操作。显然你只想插入一个给定的手动元组,所以我改变了我的建议。即使表是空的,它也应该工作。

答案 4 :(得分:-1)

可能会使用REPLACE INTO替换现有记录,如果不存在则创建新记录。如果这种方法有效,则取决于您的内容的具体细节。