重复插入

时间:2015-06-14 19:19:56

标签: mysql pdo

我想在表中插入5个新行,当且仅当5行中没有一行已经存在时。如果其中一个在表中,那么我想中止插入(不更新任何内容),并知道哪一个(或哪些)已经存在。

我可以想到很多方法(例如查看SELECT col1 WHERE col1 IN (value1,value2,...)是否返回任何内容,然后仅在不返回时插入)

我也猜测交易可以做到这一点,但我现在正在学习它们是如何工作的。但是,我不知道交易是否可以告诉我哪些条目是重复的。

无论是否有交易,有没有办法只在一两个查询中执行此操作?

由于

2 个答案:

答案 0 :(得分:1)

我怀疑有一种比你提到的解决方案更好的方法:首先运行SELECT查询,如果它没有返回任何内容,INSERT。您在一两个查询中询问了某些内容。这正是两个查询,在我看来非常有效。我无法想到为此使用交易的有效方法。如果您有多个INSERTUPDATE个查询,只有一个查询,则交易很好。

答案 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,因此只有在没有值时才会插入所有值。