通过本文可以了解到如何使用 SQlite Replace 在数据表当中插入或替换已经存在的记录。
在 SQLite 中 replace
就是,当 UNIQUE
或 RPIMARY KEY
限制冲突发生时,replace
会做两件事:
delete
)导致冲突的记录insert
)一条新的记录在第二步,如果有其它限制,导致插入操作不能完成,那么 replace
语句会略去 insert
并对数据库的操作进行回溯,即回到 replace
操作之前(存疑)。
语法:
INSERT OR REPLACE INTO table(column_list) VALUES(value_list);
或再简洁一些如下:
REPLACE INTO table(column_list) VALUES(value_list);
创建 positions
表
CREATE TABLE IF NOT EXISTS positions ( id integer PRIMARY KEY, title text NOT NULL, min_salary numeric );
插入测试数据
INSERT INTO positions (title, min_salary) VALUES ('DBA', 120000), ('Developer', 100000), ('Architect', 150000);
查看数据是否正常:
SELECT id, title, min_salary FROM positions;
创建唯一索引:
CREATE UNIQUE INDEX idx_positions_title ON positions (title);
假定,想添加一条记录到上述数据表当中,如果待新增 postion
数据不存在,则新增;如果存在,则修改为新的值。
REPLACE INTO positions (title, min_salary) VALUES ('Full Stack Developer', 140000);
要注意的是: replace
表示insert
或replace
,但不是insert
或update
例如:
REPLACE INTO positions (id, min_salary)
VALUES
(2, 110000);
上面这条 SQL 会如何操作呢?
id=2
的 position
已经存在了,所以 replace
会将之移除(id, min_salary)
,而 position
则没有数据,这与 title
列中的 NOT NULL
限制违背。于是 SQLite 就回滚了操作。s