SQLite INSERT OR REPLACE使用
在具体业务中,会遇到需要批量插入和修改数据库的情况.我们需要实现的是:
- 该条数据不存在,进行插入操作
- 该条数据存在,进行更新操作
使用INSERT OR REPLACE
命令即可满足需求,语句规范INSERT OR REPLACE INTO table-name (column-name,...) VALUES (column-value,...)
.
创建UNIQUE
约束
需求为如果NAME
已经存在,则更新,不存在则插入,创建表方式如下:
CREATE TABLE COMPANY
( ID INT PRIMARY KEY,
NAME TEXT NOT NULL UNIQUE,
AGE INT NOT NULL ,
ADDRESS CHAR(50),
SALARY REAL DEFAULT 50000.00);
如上,我们对 NAME
使用了UNIQUE
约束.什么是UNIQUE
约束?
UNIQUE
约束: 唯一约束,防止在一个特定的列存在两个记录具有相同的值
UNIQUE
和 PRIMARY KEY
约束有什么异同点?
-
相同点
PRIMARY KEY
也是UNIQUE
,即不可重复 -
不同点
-
PRIMARY KEY
是非空的,但是UNIQUE
可以为空
2.只能有一个主键,但是唯一索引可以有多个
3.如果没有指定聚合索引,那么主键默认为聚合索引,唯一索引不具备该特性
如上判断条件,数据不存在时进行插入,存在时更新,INSERT OR REPLACE
是如何判断存在条件的呢?
INSERT OR REPLACE INTO table-name (column-name,...) VALUES (column-value,...)
在如上的colunm-name
中,如果已插入的column-value
均无已存在的值,则判断插入的该条数据不存在,反正存在.
举例:
表为空时,如果执行
INSERT OR REPLACE INTO COMPANY
(ID, NAME, AGE,ADDRESS)
VALUES
(1, 'Rose', 18, '北京')
结果
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Rose | 18 | 北京 | 50000 |
在Rose已经存在的情况下进行update
INSERT OR REPLACE INTO COMPANY
(ID, NAME, AGE,ADDRESS)
VALUES
(1, 'Rose', 19, '上海')
结果
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Rose | 19 | 上海 | 50000 |
如上,ID
和NAME
都是UNIQUE的,所以命令只有在两个值都不存在时,才会进行插入,否则更新当前数据
注意
如果INSERT OR REPLACE INTO table-name (column-name,...) VALUES (column-value,...)
该数据已存在,在更新时,如果某行数据没填写,则默认为空,覆盖之前的数据.
举例:
INSERT OR REPLACE INTO COMPANY
(ID, NAME, AGE)
VALUES
(1, 'Rose', 19,)
Rose已在数据库中,会进行更新操作,没有填写ADDRESS
栏,则过去的ADDRESS
数值不会被保留,而且替换为NULL
结果
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Rose | 19 | NULL | 50000 |