繁体   English   中英

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

[英]How to catch Unique constraint error in POSTGRESQL

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

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

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

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

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

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

如果它没有返回任何东西 - 有错误。

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

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

并且不会插入记录。
如果您从所有级别执行此操作,则会抛出异常并显示与此类似的消息。 如何处理这个异常取决于程序员。

如果您的 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM