2016-06-11 27 views
1

我试图将数据插入到具有外键约束的表中。如果在我插入的行中存在违反约束的情况,我想将这些数据移开。是否有可能在postgres中捕获外键违规

问题是,每次我违反约束时,postgres都会返回一个错误。是否有可能在我的插入语句中有一些声明,如'ON FOREIGN KEY CONSTRAINT DO NOTHING'?

编辑:

这是我想做的查询,其中的信息是一个字典:

cursor.execute("INSERT INTO event (case_number_id, date, \ 
session, location, event_type, worker, result) VALUES \ 
(%(id_number)s, %(date)s, %(session)s, \ 
%(location)s, %(event_type)s, %(worker)s, %(result)s) ON CONFLICT DO NOTHING", info) 

它出现了错误时,有一个外键冲突

+0

这是什么错误了。你可以静静地忽略调用插入的代码中的错误。 – Mureinik

+0

我该怎么做? – chris

+0

这取决于调用代码和它的编写语言 – Mureinik

回答

1

如果您只能一次插入一行,您可以在插入失败前创建savepoint,并在插入失败时创建rollback(或插入成功时为release it)。

对于Postgres 9.5或更高版本,您可以使用INSERT ... ON CONFLICT DO NOTHING来完成它所说的。你也可以ON CONFLICT DO UPDATE SET column = value...,它会自动将插入转换为你与之冲突的行的更新(该功能有时称为“upsert”)。

因为OP是处理一个外键约束而不是独特约束这是行不通的。在这种情况下,您可以最轻松地使用前面描述的保存点方法,但对于多行来说,它可能会很乏味。如果您需要一次插入多行,则应该将其合理地高效地分割为多个插入语句,提供的您不是working in autocommit mode,所有插入发生在一个事务中,并且您没有插入大量的行。

有时,您确实需要在单个语句中使用多个插入,因为与数据库交谈的往返开销加上每个插入的保存点的成本太高。在这种情况下,有许多不完美的方法。也许最不坏是建立它选择你的数据,并加入其对其他表嵌套查询,像这样:

INSERT INTO table_A (column_A, column_B, column_C) 
SELECT A_rows.* 
FROM VALUES (...) AS A_rows(column_A, column_B, column_C) 
JOIN table_B ON A_rows.column_B = table_B.column_B; 
+0

冲突什么也不帮助我。我已经拥有了它,但是完整性错误仍然存​​在 – chris

+0

yup,只是发布了查询! – chris

+0

@chris:我也需要错误信息和Postgres版本。 – Kevin

相关问题