查询无法按我预期的方式加载数据,覆盖现有数据
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。
我有以下查询:
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。