首先,我知道REPLACE INTO
和INSERT INTO ... ON KEY DUPLICATE UPDATE
,但这不是我正在寻找的 - 或者 - 我不知道如何使用它们来达到我想要的目的。
这是我简单的表结构:
+-----------+---------+----------+----------+
| player_id | item_id | quantity | location |
+-----------+---------+----------+----------+
我的INSERT
查询如下所示:
INSERT INTO items VALUES (2, 10, 40, 1);
现在,如果有一行所有字段都匹配,则数量除外(如果匹配与否则无关紧要,但关键是其他3匹配)。所以,如果有一行,其中player_id是2,item_id是10,位置是1(数量值无关紧要 - 它可以是40,但也不必),然后我想更新它,而不是插入一个新的。
显然,我正在寻找一种与SELECT
+ UPDATE
不同的方式,如果有的话...
答案 0 :(得分:1)
如果没有其他约束要考虑,你不能只在(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)
根据您的问题,我认为这是您想要的行为。如果没有,请告诉我们究竟什么不起作用或我没有正确理解你的地方。
答案 1 :(得分:0)
好吧,您可以使用BEFORE INSERT
triggers
,它将在每次插入之前执行,并根据值进行必要的更改。
在此处阅读更多内容:http://dev.mysql.com/doc/refman/5.0/en///create-trigger.html