问题描述
我需要检查数据库中是否存在相似的数据,并跳过该插入操作。这个问题可能看起来像重复的,但是我没有找到任何解决方案。 我正在使用Postgresql数据库,并且有一个SQL查询
INSERT INTO table_name (name,dob,mobile)
VALUES ('sam','23-05-2000','8070605040');
如果我运行此命令两次,那么在检查了dob和mobile的组合唯一性之后,即应将其插入一次,即如果我输入数据(例如“ tom”,“ 23-05-2000”,“ 8070605040”),不应输入。当命令一个接一个地运行时,我现有的代码起作用。
但是,如果我通过按一个按钮在2个设备上同时运行命令,那么记录将被输入两次。
name dob mobile
sam 23-05-2000 8070605040
同时执行命令的结果
name dob mobile
sam 23-05-2000 8070605040
sam 23-05-2000 8070605040
如果还有第二个延迟,则现有代码可以正常工作。但是,从字面上看同时执行不会检查,因为尚未将其写入数据库。
我也不想在表本身上添加唯一条件,因为我无法正确理解数据,并且希望以此作为SQL查询。 如何检查并防止这种情况发生。
谢谢。
解决方法
如果我运行此命令两次,那么在检查了dob和mobile的组合唯一性之后,应该只将其插入一次
仅当将dob
/ mobile
声明为unique
或具有unique
索引时,这才成立。大概您需要:
alter table table_name add constraint unq_table_name_dob_mobile unique (dob,mobile);
数据库具有唯一的索引/约束,可确保数据完整性。无论应用程序多么努力,数据库都不允许重复数据进入表。
,如果要手动检查记录的唯一性,可以使用事务并锁定整个表:
BEGIN;
LOCK TABLE tbl IN EXCLUSIVE MODE; -- only allow read access
SELECT * FROM tbl WHERE a = 1 and b = 2;
--- if not existed,insert new record here
COMMIT;
这具有较差的性能,应仅用于这一特定需求。最好的解决方案是始终使用UNIQUE INDEX
。