1

我的表中有一组复合的 UNIQUE 列。因此,如果我插入到违反唯一键的表中,Postgresql 将返回并出错,我的 PHP 脚本可以读取此错误。

插入时,而不是这样做:

SELECT id FROM table WHERE col1='x' and col2='y'
(if no rows)
INSERT INTO table...
(else if rows are found)
UPDATE table SET...

我更喜欢使用:

INSERT INTO table...
(if error occurred then attempt to UPDATE)
UPDATE table SET...

从上面返回的错误类型将是“错误:重复键值违反唯一约束“xxxxxxxx_key”

但是,如果 INSERT 由于某些其他原因(例如无效数据)失败,则执行 UPDATE 是没有意义的。有没有办法“知道”(来自 PHP/Postgres)如果错误实际上是由于这个重复的密钥问题而不是无效数据而失败的?我只是好奇。如果数据无效,无论如何执行 UPDATE 也会返回错误,但您认为最佳做法是什么?

非常感谢!

4

2 回答 2

3

只需检查错误消息,看看你有什么样的错误。pg_result_error_field()显示了这一切。详细信息请查看 PGSQL_DIAG_SQLSTATE 和PostgreSQL 手册

于 2012-05-09T14:18:54.937 回答
3

您可能想在官方文档中查看此示例。

您可以自由添加更多WHEN EXCEPTION ... THEN处理程序,可用错误列表也可以在文档中找到

尽管在上面的示例中,如果出现任何其他错误,该函数将引发异常,但unique_violation特殊处理的错误除外。

于 2012-05-09T16:02:33.113 回答