gpt4 book ai didi

sql - 在存在唯一约束的情况下模拟UPSERT

转载 作者:行者123 更新时间:2023-12-03 18:12:52 24 4
gpt4 key购买 nike

模拟UPSERT之前已经discusssed。不过,在我的情况下,我具有PRIMARY KEY和其他UNIQUE约束,并且我想就主键提高语义-在检查唯一约束时替换现有行(如果存在)。

这是尝试使用插入或替换的方法:

drop table if exists test;
create table test (id INTEGER, name TEXT, s INTEGER,
PRIMARY KEY (id, s),
UNIQUE (name, s));

insert or replace into test values (1, "a", 0);
insert or replace into test values (1, "a", 0);
insert or replace into test values (2, "b", 0);
insert or replace into test values (2, "a", 0);


最后一条语句将替换两行。这是“插入或替换”的记录行为,但不是我想要的。

这是尝试“替换冲突”:

drop table if exists test;
create table test (id INTEGER, name TEXT, s INTEGER,
PRIMARY KEY (id, s) on conflict replace,
UNIQUE (name, s));

insert into test values (1, "a", 0);
insert into test values (1, "a", 0);


我立即收到“唯一约束失败”的消息。如果不在主键和唯一约束之间共享列,问题将消失:

drop table if exists test;
create table test (id INTEGER, name TEXT,
PRIMARY KEY (id) on conflict replace,
UNIQUE (name));

insert into test values (1, "a");
insert into test values (1, "a");
insert into test values (2, "b");
insert into test values (2, "a");


在这里,我在最后一条语句上违反了约束,这是正确的。可悲的是,我确实需要在约束之间共享一列。

关于SQL或SQLite问题,这是我不了解的东西吗?除了首先尝试插入然后在失败时进行更新之外,如何获得所需的效果?

最佳答案

您还可以尝试将ON CONFLICT REPLACE子句应用于UNIQUE约束吗?

create table test (id INTEGER, name TEXT,
PRIMARY KEY (id) on conflict replace,
UNIQUE (name) on conflict replace);

关于sql - 在存在唯一约束的情况下模拟UPSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com