一尘不染

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

mysql

我有table1并且table2在 MySQL 中。两者都有一个主auto_incrementid

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


阅读 67

收藏
2022-10-17

共1个答案

一尘不染

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

如果您尝试插入 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;

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

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

在你问之前,SQL 中没有“select * except for one column”的语法。您必须拼出要插入的列名的完整列表。

2022-10-17