Goo*_*bot 3 mysql innodb query duplication unique-constraint
考虑一个表
CREATE TABLE test
(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
external_id int(11),
number smallint(5),
value varchar(255),
UNIQUE INDEX (external_id, number),
PRIMARY KEY(id)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
将 number 的值更新为
UPDATE test SET number=number + 1 WHERE external_id='X'
Run Code Online (Sandbox Code Playgroud)
或者
UPDATE test SET number='Y' WHERE external_id='X'
Run Code Online (Sandbox Code Playgroud)
由于 external_id-number 对是唯一的,如果 number 的新值存在,则不会更新。
如何根据 UNIQUE 约束使用类似INSERT ... ON DUPLICATE KEY增加numberby的值number + 1以达到可用值并完成UPDATE任务?
首先是一个示例表
mysql> drop database if exists ali;
Query OK, 1 row affected (0.10 sec)
mysql> create database ali;
Query OK, 1 row affected (0.00 sec)
mysql> use ali;
Database changed
mysql> CREATE TABLE test
-> (
-> id int(11) unsigned NOT NULL AUTO_INCREMENT,
-> external_id int(11),
-> number smallint(5),
-> value varchar(255),
-> UNIQUE INDEX (external_id, number),
-> PRIMARY KEY(id)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.09 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
让我们插入一个初始行并将其 SELECT 回来
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (200,15,'Y')
-> ON DUPLICATE KEY UPDATE number = number + 1;SELECT * FROM test;
Query OK, 1 row affected (0.06 sec)
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 15 | Y |
+----+-------------+--------+-------+
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
让我们再次插入相同的东西
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (200,15,'Y')
-> ON DUPLICATE KEY UPDATE number = number + 1;SELECT * FROM test;
Query OK, 2 rows affected (0.10 sec)
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 16 | Y |
+----+-------------+--------+-------+
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
OK 我们同时试试value列
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (201,15,'X')
-> ON DUPLICATE KEY UPDATE
-> number = number + 1,value = VALUES(value);
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM test;
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 16 | Y |
| 5 | 201 | 15 | X |
+----+-------------+--------+-------+
2 rows in set (0.00 sec)
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (201,15,'X')
-> ON DUPLICATE KEY UPDATE
-> number = number + 1,value = VALUES(value);
Query OK, 2 rows affected (0.06 sec)
mysql> SELECT * FROM test;
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 16 | Y |
| 5 | 201 | 16 | X |
+----+-------------+--------+-------+
2 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
这次改变值和数字
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (202,15,'Z')
-> ON DUPLICATE KEY UPDATE
-> number = number + 1,
-> value = VALUES(value);
Query OK, 1 row affected (0.07 sec)
mysql> SELECT * FROM test;
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 16 | Y |
| 5 | 201 | 16 | X |
| 8 | 202 | 15 | Z |
+----+-------------+--------+-------+
3 rows in set (0.00 sec)
mysql> INSERT INTO test (external_id,number,value)
-> VALUES (202,15,'A')
-> ON DUPLICATE KEY UPDATE
-> number = number + 1,
-> value = VALUES(value);
Query OK, 2 rows affected (0.07 sec)
mysql> SELECT * FROM test;
+----+-------------+--------+-------+
| id | external_id | number | value |
+----+-------------+--------+-------+
| 1 | 200 | 16 | Y |
| 5 | 201 | 16 | X |
| 8 | 202 | 16 | A |
+----+-------------+--------+-------+
3 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
试一试 !!!
| 归档时间: |
|
| 查看次数: |
10273 次 |
| 最近记录: |