2015-06-14 75 views
0

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

我能想到的长期的方法来做到这一点(比如找如果SELECT col1 WHERE col1 IN (value1,value2,...)回报什么,然后再插入,只有当它没有)

我也想交易可以做到这一点,但我目前正在学习他们如何工作。但是,我不知道一个交易是否可以给我哪个条目是重复的。

有或没​​有交易,有没有办法在一个或两个查询中做到这一点?

感谢

回答

1

我怀疑有比你所提到的解决方案更好的方法:首先运行一个查询SELECT,如果它不返回任何东西,INSERT。您在一个或两个查询中要求提供某些内容。这恰好是两个查询,在我看来非常有效。我想不出一种有效的方式来为此使用事务。当您有多个INSERTUPDATE查询时,事务很好,您只有一个。

0

插入说明没有给很多机会做这项工作。如果你在期望的领域打开一个唯一的约束,不是插入的所有字段中唯一一个指令,以

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

+1

OP想知道哪一个(或哪些)已经存在,如果有的话。 –