2013-03-22 63 views
0

嗨我正在尝试在postgreSql表中执行以下操作,但遇到语法问题。PostgreSQL如果表A不包含值,则插入到表A和表B中

伪代码:

if (tableA.column1 does not contain value1) 
{ 
    INSERT INTO tableA (column1, column2) 
    VALUES value1, value2 
} 

// do this check even if the above already existed 
if (tableB does not contain value1 and value3 in the same row) 
{ 
    // it is ok if value1 and value3 already exist in the table, just not the same row 
    INSERT INTO tableB (column1, column2) 
    VALUES (value1, value3) 
} 

return true 

与此操作的实际语法任何帮助,将不胜感激!

+0

我不明白第一个和第二个条件是如何“归属”在一起的。你可以简单地运行两个彼此独立。 – 2013-03-22 14:12:49

+0

有趣,现在我看着它,你说得很好! – dcoffey3296 2013-03-22 14:16:55

回答

2
-- first insert: 
insert into tablea (col1, col2) 
select 1,2 
from tablea 
where not exists (select * from tablea where col1 = 1); 

-- second insert (same logic to apply a conditional insert) 
insert into tableb (col1, col2) 
select 1,2 
from tableb 
where not exists (select * from tableb where col1 = 1 and col2 = 2); 
+1

只要记住'LOCK'表或准备处理错误(如果唯一)或重复(如果不是唯一的)由于多个交易同时检查并插入相同的记录。 – 2013-03-22 14:22:36

+0

@CraigRinger:为什么锁定?是不是简单地包装到一个交易足够? – mvp 2013-03-23 08:03:17

+0

@mvp如果你知道没有其他人会同时插入,是的。但是如果你知道你知道它不会花费任何东西来锁定。插入不会彼此阻塞。如果在两个并发插入之间共享一个唯一的键,那么*两个*都将会是“SELECT”,并且看不到键,则两者都会尝试插入它。一个会赢,另一个将无法承担重复键错误,尽管无法看到冲突的行。如果*不是*唯一键,那么可见性规则将导致无法看到另一个正在插入的行以及两行被插入。 – 2013-03-23 11:27:49

相关问题