我想在表中插入5个新行,当且仅当5行中没有一行已经存在时。如果其中一个在表中,那么我想中止插入(不更新任何内容),并知道哪一个(或哪些)已经存在。
我可以想到很多方法(例如查看SELECT col1 WHERE col1 IN (value1,value2,...)
是否返回任何内容,然后仅在不返回时插入)
我也猜测交易可以做到这一点,但我现在正在学习它们是如何工作的。但是,我不知道交易是否可以告诉我哪些条目是重复的。
无论是否有交易,有没有办法只在一两个查询中执行此操作?
由于
答案 0 :(得分:1)
我怀疑有一种比你提到的解决方案更好的方法:首先运行SELECT
查询,如果它没有返回任何内容,INSERT
。您在一两个查询中询问了某些内容。这正是两个查询,在我看来非常有效。我无法想到为此使用交易的有效方法。如果您有多个INSERT
或UPDATE
个查询,只有一个查询,则交易很好。
答案 1 :(得分:0)
插入指令没有很多机会完成这项工作。如果在所需字段中打开UNIQUE约束,而不是仅在一条指令中插入所有字段
INSERT INTO FOO(col1) VALUES
(val1),
(val2),
(val3),
(val4),
(val5);
由于违反约束,它将发出异常,因此中止指令。 如果你想避免异常,那么工作变得有点变态:
INSERT INTO FOO(col1) VALUES
Seleect a.* from (Select val1
union
Select val2
union
select val3
union
select val4
union
select val5 ) a
inner join
( select g.* from(
select false b from foo where col1 in(val1,val2....)
union
select true) g
limit 1) b on b.b
会发生什么?只有在没有值的情况下,最内部查询才返回true,因此只有在没有值时才会插入所有值。