2010-07-22 45 views
0

我想在表A中插入一行,但前提是表B中存在另一行。比如像这样的东西...有条件地插入一行

IF EXISTS (SELECT * FROM B WHERE id=1) 
    INSERT INTO A 
     (id, value1, value2) 
     VALUES (1, 'foo', 'bar') 

但是,这是行不通的。会怎样?

+0

Awww。这不是(在插入行之前检查条件)真的是应用程序层的工作吗?如果该行实际上不存在,你会如何反应? – 2010-07-22 16:42:49

+0

如果该行不存在,则不需要发生任何事情。在这种情况下,只有这样做一个查询会更有效率。为了回答您的其他问题,我不认为将检查放在应用程序层中将会更好地体现风格,因为它恰好在查询旁边。 – Cam 2010-07-22 16:46:03

+0

我认为Pekka的观点是应用程序不知道查询的状态。如果条件为false,则查询成功。一般来说,你会希望你的应用程序知道*数据是否被保存。否则,你不会打扰存储它在第一个地方。 – cbednarski 2010-07-22 16:49:23

回答

3
INSERT INTO A (value1, value2, value3) 
    SELECT 'foo', 'bar', 'foo' FROM B WHERE ID = 1 

这里的一个潜在问题是,如果你的条件得到满足不止一次它会插入尽可能多的行,以便调整您的查询到更多,但它会做你想要什么,只能插入如果在选择的条件满足。

+0

+1:你打败了我,我更喜欢你。 – 2010-07-22 16:50:42

+0

你能详细解释一下它是如何工作的吗?也许我不太明白'选择',但它怎么做呢? – Cam 2010-07-22 16:51:13

+1

@incrediman:SELECT中的值是静态定义的 - 它们不是TABLE_B中存在的值 – 2010-07-22 16:54:42

0

看看this一块MySQL手册,它给出了一个SELECT的例子,但也许INSERT也会以类似的方式工作?