如果我创建一个具有唯一约束的表格,例如:
CREATE TABLE distributors (
did integer,
name varchar(40) UNIQUE
);
如果我尝试输入名称已存在的条目,会发生什么。我试图这样做,它只是退出而不显示任何错误消息。有没有办法检查是否实际插入了新条目?
答案 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;