我有table1并且table2在 MySQL 中。两者都有一个主auto_increment键id。
table1
table2
auto_increment
id
如果表模式匹配并且我对INSERT INTO table1 (SELECT * FROM table2)插入到的新行会发生什么table1?当来自的行相同时,他们是否保留旧id值并产生冲突?新值是由 auto_increment 生成的吗?它取决于存储引擎还是锁定?table1``id
INSERT INTO table1 (SELECT * FROM table2)
table1``id
您可以插入到自动增量列中并指定一个值。这可以; 它只是覆盖了自动增量生成器。
如果您尝试插入 NULL 或 0 或 的值DEFAULT,或者如果您从 INSERT 语句的列中省略自动增量列,则会激活自动增量生成器。
DEFAULT
所以,这很好INSERT INTO table1 SELECT * FROM table2(顺便说一句,你不需要括号)。这意味着将逐字复制其中的 id 值,table2并且table1不会生成新值。
INSERT INTO table1 SELECT * FROM table2
如果你想 table1生成新的值,你不能这样做SELECT *。您对 id 列使用 null 或 0:
SELECT *
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”的语法。您必须拼出要插入的列名的完整列表。