0

首先,我知道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,location 为 1(数量值无关紧要 - 它可以是 40,但也不必),那么我想更新它,而不是插入一个新的。

显然,我正在寻找一种不同于SELECT+的方法UPDATE,如果有的话......

4

2 回答 2

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)

根据您的问题,我认为这是您想要的行为。如果没有,请让我们知道究竟是什么不工作或我没有正确理解你的地方。

于 2013-05-21T19:29:37.183 回答
0

好吧,您可以使用BEFORE INSERT triggers,它将在每次插入之前执行并根据值进行所需的更改。

在这里阅读更多:http: //dev.mysql.com/doc/refman/5.0/en///create-trigger.html

于 2013-05-21T19:25:18.603 回答