mysql> create table test(a int primary key auto_increment,b varchar(10),c varchar(10),d int); Query OK, 0 rows affected (0.03 sec) mysql> alter table test add unique index uq_b(b); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> insert into test (a,b,c,d) values(1,'1','1',1) on duplicate key update c='2', d=2; Query OK, 1 row affected (0.02 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 1 | +---+------+------+------+ 1 row in set (0.01 sec) mysql> insert into test (a,b,c,d) values(2,'1','1',1) on duplicate key update d=2; Query OK, 2 rows affected (0.00 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 2 | +---+------+------+------+ 1 row in set (0.00 sec) mysql> insert into test (a,b,c,d) values(null,'2','2',1) on duplicate key update d= values(a); Query OK, 1 row affected (0.01 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 1 | +---+------+------+------+ 2 rows in set (0.01 sec) mysql> insert into test (a,b,c,d) values(null,'2','2',1) on duplicate key update d= values(a); Query OK, 2 rows affected (0.01 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 3 | +---+------+------+------+ 2 rows in set (0.00 sec) mysql> insert into test (a,b,c,d) values(null,'2','2',1) on duplicate key update d= values(a); Query OK, 2 rows affected (0.01 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 4 | +---+------+------+------+ 2 rows in set (0.00 sec) mysql> insert into test (a,b,c,d) values(null,'3','3',3); Query OK, 1 row affected (0.01 sec) mysql> select * from test; +---+------+------+------+ | a | b | c | d | +---+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 4 | | 5 | 3 | 3 | 3 | +---+------+------+------+ 3 rows in set (0.01 sec)
REPLACE算法(LOAD DATA… REPLACE):
mysql> select * from test; +----+------+------+------+ | a | b | c | d | +----+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 2 | | 4 | 4 | 4 | 4 | | 5 | 3 | 3 | 7 | | 8 | 12 | 8 | 8 | | 13 | 14 | 10 | 14 | | 14 | 10 | 10 | 10 | +----+------+------+------+ 7 rows in set (0.01 sec) mysql> replace into test (a,b,c,d) values (14,'14',9,9); Query OK, 3 rows affected (0.01 sec) mysql> select * from test; +----+------+------+------+ | a | b | c | d | +----+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 2 | | 4 | 4 | 4 | 4 | | 5 | 3 | 3 | 7 | | 8 | 12 | 8 | 8 | | 14 | 14 | 9 | 9 | +----+------+------+------+ 6 rows in set (0.00 sec) mysql> replace into test (a,b,c,d) values (14,NULL,'',14); Query OK, 2 rows affected (0.01 sec) mysql> select * from test; +----+------+------+------+ | a | b | c | d | +----+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 2 | | 4 | 4 | 4 | 4 | | 5 | 3 | 3 | 7 | | 8 | 12 | 8 | 8 | | 14 | NULL | | 14 | +----+------+------+------+ 6 rows in set (0.00 sec) mysql> REPLACE INTO test SET a = 14 ,b= (select b from test where b = 12) ,c='12',d=12; ERROR 1093 (HY000): You can't specify target table 'test' for update in FROM clause mysql> select b from test where b = 12; +------+ | b | +------+ | 12 | +------+ 1 row in set (0.02 sec) mysql> REPLACE INTO test SET a = 14 ,b= (select '12') ,c='12',d=12; Query OK, 3 rows affected (0.01 sec) mysql> select * from test; +----+------+------+------+ | a | b | c | d | +----+------+------+------+ | 1 | 1 | 2 | 2 | | 2 | 2 | 2 | 2 | | 4 | 4 | 4 | 4 | | 5 | 3 | 3 | 7 | | 14 | 12 | 12 | 12 | +----+------+------+------+ 5 rows in set (0.00 sec)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29733787/viewspace-1399583/ ,如需转载,请注明出处,否则将追究法律责任。