INSERT INTO ...选择所有MySQL列

Kyl*_*yle 114 mysql select insert-into

我正在尝试从以下位置移动旧数据:

this_table >> this_table_archive
Run Code Online (Sandbox Code Playgroud)

复制所有列.我试过这个,但它不起作用:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');
Run Code Online (Sandbox Code Playgroud)

注意:表格相同并已id设置为主键.

Mar*_*ers 212

手册中描述了正确的语法.试试这个:

INSERT INTO this_table_archive (col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)

如果id列是自动增量列,并且您已经在两个表中都有一些数据,那么在某些情况下,您可能希望省略列列表中的id并生成新的ID,以避免插入原始中已存在的ID表.如果您的目标表为空,那么这不是问题.


Ric*_*iwi 66

对于语法,它看起来像这样(省略列列表隐含地表示"全部")

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)

如果已在归档表中包含数据,则用于避免主键错误

INSERT INTO this_table_archive
SELECT t.*
FROM this_table t
LEFT JOIN this_table_archive a on a.id=t.id
WHERE t.entry_date < '2011-01-01 00:00:00'
  AND a.id is null  # does not yet exist in archive
Run Code Online (Sandbox Code Playgroud)

  • 左连接为+1以避免主键冲突. (6认同)

Pra*_*tik 22

除了马克拜尔斯回答:

有时您还想插入硬编码的详细信息,否则可能存在唯一约束失败等.因此,在您覆盖列的某些值的情况下使用以下内容.

INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367
Run Code Online (Sandbox Code Playgroud)

这里的值是由我以硬编码的方式添加来摆脱唯一约束.