Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 尽管进行了检查,但同时执行Insert命令会将数据写入数据库两次_Sql_Postgresql_Duplicates_Sql Insert - Fatal编程技术网

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

Sql 尽管进行了检查,但同时执行Insert命令会将数据写入数据库两次,sql,postgresql,duplicates,sql-insert,Sql,Postgresql,Duplicates,Sql Insert,我需要检查数据库中是否存在类似的数据,并跳过该插入。这个问题看起来像是重复的,但我没有找到任何解决办法。 我正在使用PostgreSQL数据库,我有一个SQL查询 INSERT INTO table_name (name, dob, mobile) VALUES ('sam', '23-05-2000', '8070605040'); 如果我运行此命令两次,则在检查dob和mobile的组合唯一性后,只应插入一次,即如果我输入类似于('tom'、'23-05-2000'、'807060504

我需要检查数据库中是否存在类似的数据,并跳过该插入。这个问题看起来像是重复的,但我没有找到任何解决办法。 我正在使用PostgreSQL数据库,我有一个SQL查询

INSERT INTO table_name (name, dob, mobile)
VALUES ('sam', '23-05-2000', '8070605040'); 
如果我运行此命令两次,则在检查dob和mobile的组合唯一性后,只应插入一次,即如果我输入类似于('tom'、'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;

这有很差的性能,应该只用于这一个特定的需要。最好的解决方案是始终使用
唯一索引

谢谢。我确实理解这一点。但正如我所说的,我不了解表或以前的数据,也不想更改任何表约束。目前,检查是通过select语句完成的。那么,在将事务写入数据库之前,是否无法检查事务中的数据?@Glitch_Znab。如果要确保数据完整性,则需要由数据库负责。从应用程序中尝试这样做只会导致难以调试的竞争条件和不准确的数据。谢谢。我最终使用了这个,并且建议使用这个。但由于@Kassian的答案解决了我的具体问题,我接受了这个答案。再次感谢,谢谢。让我试试看。但我有一个问题。如果我锁定表,其他查询会保存在队列中还是会被刷新?它会在客户端被阻止,请等待您当前的transactionExplicit表锁定是一个麻烦,通常是不完全理解数据库并发处理的症状。同意,但我不认为您回答了这个特定问题。这不是一个关于“理解数据库系统”的问题,它只是关于找到一种特定的技术来解决特定的需求。“但正如我所说的,我不理解表或以前的数据,也不想更改任何表约束”,实际上,这在设计糟糕的生产系统中非常常见。如果生产数据库包含许多脏数据,则需要先防止重复,然后才能使用唯一索引或其他方法修复数据库。如果要防止重复,唯一可靠的方法是创建唯一索引。如果您不“理解”数据,那么您如何知道不允许重复?
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;