在MySQL数据库中,我有一个表test
,其中有两列foo
和bar
。我正在尝试编写单个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;
答案 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');
答案 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
替换现有记录,如果不存在则创建新记录。如果这种方法有效,则取决于您的内容的具体细节。