一:场景

1:表结构和数据

CREATE TABLE `test` (
  `id` INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR ( 32 ) NOT NULL COMMENT '名字',
  `age` TINYINT(3) UNSIGNED NOT NULL  COMMENT '年龄',
  PRIMARY KEY ( `id` ),
  UNIQUE KEY `uni_username` (`username`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

INSERT INTO test (username,age) VALUES 
("假装是李白",18),
("鲁迅是不是周树人",38),
("微微一笑",16);

2:需求写入数据,username有可能会重复

INSERT INTO test (username,age) VALUES 
("test",38),
("假装是李白",18),
("test1",38),
("test2",16);

批量插入数据,里面有唯一索引冲突,会报错,全部插入不成功。

3,用replace插入

REPLACE的工作方式与INSERT完全相同,不同之处在于,如果 table 中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除该旧行

REPLACE INTO test (username,age) VALUES 
("test",38),
("假装是李白",18),
("test1",38),
("test2",16);

执行之前 执行之后

二:方案

1:thinkphp,第二个参数为true代表使用replace

Db::name("test")->insertAll($data, true)