Mysql

在 INSERT (SELECT * FROM…) 中如何處理 auto_increment 鍵

  • August 11, 2016

我有table1並且table2在 MySQL 中。兩者都有一個主auto_incrementid

如果表模式匹配並且我對INSERT INTO table1 (SELECT * FROM table2)插入到的新行會發生什麼table1?當來自的行相同時,他們是否保留舊id值並產生衝突?新值是由 auto_increment 生成的嗎?它取決於儲存引擎還是鎖定?table1``id

您可以插入到自動增量列中並指定一個值。這可以; 它只是覆蓋了自動增量生成器。

如果您嘗試插入 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”的語法。您必須拼出要插入的列名的完整列表。

引用自:https://dba.stackexchange.com/questions/60521