我需要插入或替换现有的数据库,但它无法正常工作。
示例:
select * from tab where name = 'foo';
6530|foo|ok|||
insert or replace into tab values('foo', 'ok', 1, 2, 3);
select * from tab where name = 'foo';
6530|foo|ok|||
43523|foo|ok|1|2|3
为什么insert-replace不会将现有字段“更新”到记录6530中并创建一个新字段?
表:
create table tab(
id integer unique primary key,
name text not null,
tipo text not null,
val1 integer,
val2 integer,
val3 integer
);
答案 0 :(得分:0)
您需要在列中的一个或组合上具有唯一索引,例如:
CREATE UNIQUE INDEX idx_tab ON tab (name, tipo);
当表中存在相同的值时,记录将被删除并插入新值。您可以使用以下内容进行UPSERT:
INSERT OR REPLACE INTO tab (id, name, tipo, val1, val2, val3)
SELECT old.id, new.name, new.tipo, new.val1, new.val2, val3
FROM ( SELECT
'foo' AS name,
'ok' AS tipo,
1 AS val1,
2 AS val2,
3 AS val3
) AS new
LEFT JOIN (
SELECT id, name, tipo, val1, val2, val3
FROM tab
) AS old ON new.name= old.name;
答案 1 :(得分:0)
插入或更新命令可以在定义的唯一键上使用。 Ins或Upd之后的两个不同行的原因是因为您没有传递引擎执行更新所需的唯一ID,而是(因为缺少ID)正在执行Insert。 查询后:
select * from tab where name = 'foo';
执行:
insert or replace into tab values(ID, foo', 'ok', 1, 2, 3);
虽然ID是从上一个查询得到的ID(即6530)
现在该行将会更新。
答案 2 :(得分:0)
示例:插入或替换不起作用
假设表中有3列.. ID,NAME,ROLE
BAD:这将使用ID = 1的新值插入或替换所有列:
INSERT OR REPLACE INTO Employee (id, name, role)
VALUES (1, 'John Foo', 'CEO');
BAD:这将插入或替换2列... NAME列将设置为NULL或默认值:
INSERT OR REPLACE INTO Employee (id, role)
VALUES (1, 'code monkey');
GOOD:这将更新2列。当ID = 1时,NAME将不受影响。当ID = 1不存在时,名称将为默认值(NULL)。
INSERT OR REPLACE INTO Employee (id, role, name)
VALUES ( 1,
'code monkey',
(SELECT name FROM Employee WHERE id = 1)
);
这将更新2列。当ID = 1时,ROLE将不受影响。当ID = 1不存在时,角色将设置为“Benchwarmer”而不是默认值。
INSERT OR REPLACE INTO Employee (id, name, role)
VALUES ( 1,
'Susan Bar',
COALESCE((SELECT role FROM Employee WHERE id = 1), 'Benchwarmer')
);