REPLACE—替换写入数据库
REPLACE 与 INSERT 类似,但插入的新行与表中的旧行发生 PRIMARY KEY 或 UNIQUE (唯一)索引冲突时,则在插入新行之前将删除旧行。REPLACE是SQL的标准扩展。
要使用REPLACE,必须用拥有表的 INSERT 和 DELETE 权限
示例:
语句创建的表test,主键为id列
CREATE TABLE test (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NULL,
`age` int(4) NULL,
`address` varchar(255) NULL,
PRIMARY KEY (`id`)
);
向表中插入一条id=1的数据行,下图插入成功返回的信息影响行数为1,因为表中没有主键(id)为1的数据,如果有主键(id)为1的数据,则影响行数为2,mysql会先删除主键(id)为1的数据,在插入新的数据
如果多个字段可以设置唯一索引
ON DUPLICATE KEY UPDATE
上面写法并不理想,因为会先删除旧行,在写入新行,如果希望可以保留旧行部分值,则可以使用
INSERT INTO …. ON DUPLICATE KEY UPDATE
在项目使用insert增加中,如果主键或唯一索引在现有表中已经存在,则会执行更新操作,实现方式就是在SQL语句insert中添加 on duplicate key update ,表示存在就执行 update语句,不存在执行 insert语句
INSERT INTO demotabele(name,age) VALUES("张三",18) ON DUPLICATE KEY UPDATE address="乌镇";
mybatis中使用格式
insert into demotabele
(name,age,address)
values
(#{name},#{age},#{address})
ON DUPLICATE KEY UPDATE
username=values(username),
age=values(age)
分三段来理解:
- 第一段,常规的INSERT语句。INSERT INTO (col1, col2, …) VALUES (val1, val2, …)
- 第二段,ON DUPLICATE KEY,表示后面的语句是当数据有冲突的情况下会执行的
- 第三段,UPDATE语句。UPDATE a=1, b=2
- 主键(Primary Key)
- 唯一索引(Unique Key)
注意,由于有 ON DUPLICATE KEY,也就是说必须得有字段会发生冲突。什么属性的字段能冲突呢?