如何捕获POSTGRESQL中的唯一约束错误

时间:2011-05-02 11:34:23

标签: c++ postgresql

如果我创建一个具有唯一约束的表格,例如:

CREATE TABLE distributors (
    did     integer,
    name    varchar(40) UNIQUE
); 

如果我尝试输入名称已存在的条目,会发生什么。我试图这样做,它只是退出而不显示任何错误消息。有没有办法检查是否实际插入了新条目?

2 个答案:

答案 0 :(得分:2)

如果插入失败,应该在某处设置错误代码,可以通过您正在使用的界面的某些方法读取 - 更多详细信息肯定在您的访问库/模块的文档中。

或者,您可以将插入更改为:

INSERT INTO distributors (did, name) values ( ... ) RETURNING did;

如果它没有返回任何东西 - 那就出错了。

答案 1 :(得分:0)

如果您尝试插入名称已存在的记录,您将收到如下错误消息:

ERROR:  duplicate key value violates unique constraint "distributors_name_key"
DETAIL:  Key (name)=(aaa) already exists.

并且不会插入记录 如果从allplcation级别执行此操作,将抛出异常,并显示与此类似的消息。程序员应该如何处理这个异常。

如果您的ID字段是自动生成(SERIAL或BIGSERIAL),并且您只插入名称,如果您插入已存在的名称,即使您没有插入任何记录,ID序列也会增加1。

为了避免在INSERT检查之前可以进行“SELECT”查询,记录已经存在。可以在一个事务中完成所有操作,伪代码:

BEGIN TRANSACTION;
int records = SELECT name FROM table WHERE name = 'aaa' FOR UPDATE;  //FOR UPDATE to lock the row from being read by other user until transaction finishes.
if (records == 0)
   INSERT INTO table VALUES (1, 'aaa');
else
   MessageBox.Show("Record already exists");
COMMIT TRANSACCTION;