尽管检查,但同时执行 Insert 命令将数据两次写入数据库
Executing Insert command at the same time writes the data twice to database despite a check
我需要检查数据库中是否存在类似数据并跳过该插入。这个问题可能看起来像是重复的,但我没有找到任何解决方案。
我正在使用 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
即使有第二次延迟,现有代码也能正常工作。但是同时按字面执行不会检查,因为它还没有写入数据库。
我也不想在 table 本身上添加唯一条件,因为我没有正确理解数据并且想将其作为 SQL 查询来执行。
我该如何检查并防止这种情况发生。
谢谢。
If I run this command twice then it should only be inserted once after checking for the combined uniqueness of dob and mobile
仅当 dob
/mobile
被声明为 unique
或具有 unique
索引时才成立。据推测,您需要:
alter table table_name add constraint unq_table_name_dob_mobile unique (dob, mobile);
有了唯一的index/constraint,数据库保证了数据的完整性。无论应用程序多么努力,数据库都不允许重复项进入 table。
如果要手动检查记录的唯一性,可以使用事务并锁定整个table:
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
.
我需要检查数据库中是否存在类似数据并跳过该插入。这个问题可能看起来像是重复的,但我没有找到任何解决方案。 我正在使用 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
即使有第二次延迟,现有代码也能正常工作。但是同时按字面执行不会检查,因为它还没有写入数据库。
我也不想在 table 本身上添加唯一条件,因为我没有正确理解数据并且想将其作为 SQL 查询来执行。 我该如何检查并防止这种情况发生。
谢谢。
If I run this command twice then it should only be inserted once after checking for the combined uniqueness of dob and mobile
仅当 dob
/mobile
被声明为 unique
或具有 unique
索引时才成立。据推测,您需要:
alter table table_name add constraint unq_table_name_dob_mobile unique (dob, mobile);
有了唯一的index/constraint,数据库保证了数据的完整性。无论应用程序多么努力,数据库都不允许重复项进入 table。
如果要手动检查记录的唯一性,可以使用事务并锁定整个table:
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
.