在 INSERT (SELECT * FROM ...) 中如何处理 auto_increment 键

Tho*_*son 14 mysql primary-key auto-increment

我有table1table2在 MySQL 中。两者都有一个主auto_incrementid

如果表模式匹配并且我对INSERT INTO table1 (SELECT * FROM table2)插入到的新行执行什么操作table1id当一行 fromtable1相同时,它们是否保留旧值并产生冲突id?新值是否由 auto_increment 生成?它取决于存储引擎还是锁定?

Bil*_*win 17

您可以插入自动增量列并指定一个值。这可以; 它只是覆盖自动增量生成器。

如果您尝试插入 NULL 或 0 或 的值DEFAULT,或者如果您从 INSERT 语句中的列中省略自动增量列,则会激活自动增量生成器。

因此,可以INSERT INTO table1 SELECT * FROM table2(顺便说一下,您不需要括号)。这意味着,在ID值table2将被逐字复制,并且table1不会产生新的价值。

如果 table1生成新值,则无法执行SELECT *. 您可以为 id 列使用 null 或 0:

INSERT INTO table1 SELECT 0, col1, col2, col3, ... FROM table2;
Run Code Online (Sandbox Code Playgroud)

否则,您可以从 INSERT 语句的列列表和 SELECT 语句的选择列表中省略该列:

-- No id in either case:
INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3, ... FROM table2;
Run Code Online (Sandbox Code Playgroud)

在您询问之前,SQL 中没有“选择 * 除了一列”的语法。您必须拼出要插入的列名称的完整列表。