查询无法按我预期的方式加载数据,覆盖现有数据

Query fails to load data in the way I expect, overwrites existing data

我有以下查询:

INSERT INTO `user_pen_names` (`uid`,`pnid`,`my_name`) VALUES ('7','200','stink') ON DUPLICATE KEY UPDATE `my_name`=values(`my_name`)

我的 table 定义了以下列:

id   INT  primary, auto-increment
uid  INT  unsigned, unique
pnid INT  unsigned, unique
my_name VARCHAR(24)

我已经有一个 table 条目:

id(0), uid(7), pnid(100), my_name(test)

当我执行上面的查询时,我期望看到的是两行:

id(0), uid(7), pnid(100), my_name(test)
id(1), uid(7), pnid(200), my_name(stink)

发生了什么,我因此感到困惑,是现有行正在被修改...

id(0), uid(7), pnid(100), my_name(stink)

如果我修改 uid 和 pnid 使它们不再唯一,也会发生同样的事情。任何人都可以向我解释为什么会这样吗?

EDIT 我使用以下命令使两列的组合唯一:

ALTER TABLE `user_pen_names` ADD UNIQUE KEY `upn_unique_id` (`uid`, `pnid`)

我以前没有这样做过,但理论上,只有当 uid 和 pnid 匹配 table 中已有的行时,INSERT 命令才应转移到它的 UPDATE 子命令。然而,这也没有用。

您已将 uid 和 pnid 设置为唯一。因此,因为您不能插入另一个 uid=7,所以它正在修改 uid 已经为 7 的第 7 行。

对我来说效果很好。我怀疑你没有 运行 你认为自己 运行ning 的测试。

我在装有 MySQL 8.0.1:

的 Macbook 上进行了测试
mysql> CREATE TABLE `user_pen_names` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned DEFAULT NULL,
  `pnid` int(10) unsigned DEFAULT NULL,
  `my_name` varchar(24) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`,`pnid`)
);

mysql> INSERT INTO `user_pen_names` (id, `uid`,`pnid`,`my_name`) VALUES (0, '7','100','test');

mysql> INSERT INTO `user_pen_names` (`uid`,`pnid`,`my_name`) VALUES ('7','200','stink') 
    ON DUPLICATE KEY UPDATE `my_name`=values(`my_name`);

mysql> SELECT * FROM user_pen_names;
+----+------+------+---------+
| id | uid  | pnid | my_name |
+----+------+------+---------+
|  1 |    7 |  100 | test    |
|  2 |    7 |  200 | stink   |
+----+------+------+---------+

请注意,当您将 0 插入自增列时,它会生成一个从 1 开始的新 ID。