一,不存在则插入,存在则更改的情况
两种选择①REPLACE INTO t_score (NO,score)VALUES ('a','100') ;要保证no是唯一主键,这个语句,如果是不存在插入式,mysql 返回受影响行数为1,如果是存在则更新,则返回受影响行数为2;如果这个表里有个自增ID的情况,那么存在则更新的时候自增ID会每次增加1,但是存在则更新会使自增ID增加2。即使每次执行的时候数据一样,也会执行更新,返回更改行数为2。
②INSERT INTO t_score(NO,score) VALUES('a','102' )ON DUPLICATE KEY UPDATE score='103',或者INSERT INTO t_user(userno,DATA) VALUES ('d','9899') ON DUPLICATE KEY UPDATE DATA=VALUES(DATA);no保证唯一主键,第一次执行受影响行数为1,core存入值为102,第二次执行受影响行数为2,自增ID不变设为n,socre存入值为103,但是下一次主键自增会变成n+2
select * from t_score;
+----+------+-------+
| id | no | score |
+----+------+-------+
| 46 | a | 103 |
| 48 | b | 102 |
+----+------+-------+
CREATE TABLE `t_score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`no` varchar(11) DEFAULT NULL,
`score` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `NewIndex1` (`no`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8
总之每次replace更改每次都会更新 都会使自己的自增主键更改为最新生成的主键,INSERT INTO t_score(NO,score) VALUES('a','102' )ON DUPLICATE KEY UPDATE score='103', 在不存在的情况下会插入102,在存在的情况下会更改为103,自己的自增主键不改变,但是会影响到后续再次生成的主键
二,不存在则插入,存在则不插入的情况
①如果有主键的话,用普通的insert into就可以
INSERT INTO t_user(userno,DATA) VALUES ('d','9899') ON DUPLICATE KEY UPDATE DATA=DATA;
②无主键的情况
INSERT INTO t_value (NAME,VALUE) SELECT 'a','102' FROM DUAL WHERE NOT EXISTS (SELECT NAME FROM t_value WHERE NAME='a');