![](/img/trans.png)
[英]How can I catch a unique constraint violation through QT's QSqlDatabase interface?
[英]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.