mysql - 在 SELECT 子句中使用列别名的 INSERT + SELECT + ON DUPLICATE KEY

标签 mysql select insert sql-update

当我试图在 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 不存在:

ERROR 1054 (42S22): Unknown column 'source.p' in 'field list'

相当不方便,我不得不求助于使用更慢、更麻烦的查询:

INSERT INTO dest 
    SELECT * FROM ( 
         SELECT id, POW(v, 2) AS p FROM source 
    ) s
    ON DUPLICATE KEY UPDATE dest.v=s.p;

这与原始查询差别很小,但有效。为什么会这样?

最佳答案

我总是把查询写在下面

INSERT INTO dest ( id, v)
SELECT id, POW(v, 2) AS p FROM source 
ON DUPLICATE KEY UPDATE dest.v=VALUES(v);

VALUES() 避免再次编写相同的表达式。始终尝试指定要插入的列名称,以防万一将来某个时间向表中添加新列

关于mysql - 在 SELECT 子句中使用列别名的 INSERT + SELECT + ON DUPLICATE KEY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29069210/

相关文章:

php - MYSQL中如何连接所有三个表?

php - 多维数组导致 PHP 插入查询中出现 mysql 错误

php - 两个不同函数中的 while 循环内的 while 循环?

mysql - 如何从另一个bigquery响应将值插入到mysql表中

MySQL SELECT 查询性能

html - 为 Internet Explorer 8 中的所有非多选标签设置 css 属性

Oracle:插入时不指定列

mysql - 如何将两条 SQL 语句合并为一条语句?

php重定向到另一个页面

mysql - 使用 MySQL 选择多个变量