所有 MySQL 列的 INSERT INTO... SELECT

我试着把旧的数据从:

this_table >> this_table_archive

把所有栏目都拷贝过来,我试过了,但没用:

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

注意: 这些表是相同的,并且设置 id作为主键。

268830 次浏览

手动操作中描述了正确的语法:

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

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

对于语法,如下所示(省略列列表以隐式表示“ all”)

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'

如果归档表中已有数据,则可避免主键错误

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

你不需要双()的值位? 如果不尝试这一点(虽然必须有一个更好的方法

insert into this_table_archive (id, field_1, field_2, field_3)
values
((select id from this_table where entry_date < '2001-01-01'),
((select field_1 from this_table where entry_date < '2001-01-01'),
((select field_2 from this_table where entry_date < '2001-01-01'),
((select field_3 from this_table where entry_date < '2001-01-01'));

除此之外,马克•拜尔斯(Mark Byers)还回答道:

有时你也想插入 硬编码的的细节,否则可能有唯一约束失败等。因此,在覆盖列的某些值的情况下,可以使用以下命令。

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

在这里,我用 Hardcoded 的方法增加了 abc0值,以摆脱 Unique 的约束。

更多例子及详情

    INSERT INTO vendors (
name,
phone,
addressLine1,
addressLine2,
city,
state,
postalCode,
country,
customer_id
)
SELECT
name,
phone,
addressLine1,
addressLine2,
city,
state ,
postalCode,
country,
customer_id
FROM
customers;