如果没有其他约束要考虑,你不能只在(player_id、item_id 和 location)上添加一个组合的唯一键,然后去INSERT INTO ... ON DUPLICATE KEY UPDATE
吗?
编辑:试图澄清。我想你有类似下面的表创建语句:
CREATE TABLE items (
player_id INT NOT NULL,
item_id INT NOT NULL,
quantity INT NOT NULL,
location INT NOT NULL
) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
您为三列添加组合唯一索引:
ALTER TABLE items ADD UNIQUE player_item_location (player_id, item_id, location);
所以你可以插入这一行:
INSERT INTO items (player_id, item_id, quantity, location) VALUES (2, 10, 40, 1);
如果您尝试再次执行相同的 INSERT,您最终会收到以下消息:
#1062 - Duplicate entry '2-10-1' for key 'player_item_location'
但是如果你添加ON DUPLICATE KEY UPDATE
这样的:
INSERT INTO items (player_id, item_id, quantity, location) VALUES (2, 10, 30, 1) ON DUPLICATE KEY UPDATE quantity = 30;
您最终不会添加另一行,而是更新现有行(玩家 2,项目 10,位置 1)并将其数量从 40 更改为 30。
而且,如果您想添加另一行,例如玩家 3、项目 10、位置 1,这也可以:
INSERT INTO items (player_id, item_id, quantity, location) VALUES (3, 10, 40, 1);
因此,在三个 INSERT 之后,您应该最终在表中包含以下行:
mysql> SELECT * FROM items;
+-----------+---------+----------+----------+
| player_id | item_id | quantity | location |
+-----------+---------+----------+----------+
| 2 | 10 | 30 | 1 |
| 3 | 10 | 40 | 1 |
+-----------+---------+----------+----------+
2 rows in set (0.00 sec)
根据您的问题,我认为这是您想要的行为。如果没有,请让我们知道究竟是什么不工作或我没有正确理解你的地方。