【发布时间】:2015-05-18 02:49:39
【问题描述】:
在 SELECT 子句具有列别名的查询中尝试将 INSERT、SELECT 和 ON DUPLICATE KEY 链接在一起时,我遇到了一个相当令人惊讶的障碍。例如,考虑以下情况:
表格:
CREATE TABLE source (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
v INT NOT NULL
);
INSERT INTO source (v) VALUES (1), (2), (3);
CREATE TABLE dest (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
v INT NOT NULL
);
假设我试图用POW(source.v,2) 的值填充dest.v,而不管dest 中是否已经存在值。当然,我试过了:
INSERT INTO dest
SELECT id, POW(v, 2) AS p FROM source
ON DUPLICATE KEY UPDATE dest.v=source.p;
但是,MySQL 坚持认为 source.p 不存在:
错误 1054 (42S22):“字段列表”中的未知列“source.p”
相当不方便,我不得不求助于使用更慢更麻烦的查询:
INSERT INTO dest
SELECT * FROM (
SELECT id, POW(v, 2) AS p FROM source
) s
ON DUPLICATE KEY UPDATE dest.v=s.p;
这与原始查询几乎没有什么不同,但有效。为什么会这样?
【问题讨论】:
-
您的替代代码只是添加了一组新记录,因为选择结果中没有键字段来进行重复的键击。
标签: mysql select insert sql-update