根据行数据插入或更新

时间:2013-05-21 19:13:06

标签: mysql sql

首先,我知道REPLACE INTOINSERT 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不同的方式,如果有的话...

2 个答案:

答案 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