尽管执行了一次检查,但同时执行插入命令会将数据两次写入数据库

问题描述

我需要检查数据库中是否存在相似的数据,并跳过该插入操作。这个问题可能看起来像重复的,但是我没有找到任何解决方案。 我正在使用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