REPLACE—替换写入数据库

REPLACE 与 INSERT 类似,但插入的新行与表中的旧行发生 PRIMARY KEY 或 UNIQUE (唯一)索引冲突时,则在插入新行之前将删除旧行。REPLACE是SQL的标准扩展。
要使用REPLACE,必须用拥有表的 INSERT 和 DELETE 权限

示例:

语句创建的表test,主键为id列

  1. CREATE TABLE test (
  2. `id` int(20) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NULL,
  4. `age` int(4) NULL,
  5. `address` varchar(255) NULL,
  6. PRIMARY KEY (`id`)
  7. );

向表中插入一条id=1的数据行,下图插入成功返回的信息影响行数为1,因为表中没有主键(id)为1的数据,如果有主键(id)为1的数据,则影响行数为2,mysql会先删除主键(id)为1的数据,在插入新的数据
image.png
如果多个字段可以设置唯一索引
image.png

ON DUPLICATE KEY UPDATE

上面写法并不理想,因为会先删除旧行,在写入新行,如果希望可以保留旧行部分值,则可以使用
INSERT INTO …. ON DUPLICATE KEY UPDATE
在项目使用insert增加中,如果主键或唯一索引在现有表中已经存在,则会执行更新操作,实现方式就是在SQL语句insert中添加 on duplicate key update ,表示存在就执行 update语句,不存在执行 insert语句

  1. INSERT INTO demotabele(name,age) VALUES("张三",18) ON DUPLICATE KEY UPDATE address="乌镇";

mybatis中使用格式

  1. insert into demotabele
  2. (name,age,address)
  3. values
  4. (#{name},#{age},#{address})
  5. ON DUPLICATE KEY UPDATE
  6. username=values(username),
  7. age=values(age)

分三段来理解:

  • 第一段,常规的INSERT语句。INSERT INTO (col1, col2, …) VALUES (val1, val2, …)
  • 第二段,ON DUPLICATE KEY,表示后面的语句是当数据有冲突的情况下会执行的
  • 第三段,UPDATE语句。UPDATE a=1, b=2
  • 注意,由于有 ON DUPLICATE KEY,也就是说必须得有字段会发生冲突。什么属性的字段能冲突呢?

    • 主键(Primary Key)
    • 唯一索引(Unique Key)