Answers:
您可以插入自动增量列中并指定一个值。这可以; 它只是覆盖了自动增量生成器。
如果您尝试插入NULL或0或值DEFAULT
,或者如果您从INSERT语句的列中省略了auto-increment列,则这将激活auto-increment生成器。
因此,这样做很好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 *除了一列”的语法。您必须拼出要插入的列名的完整列表。
select * from table
,是否有办法对该子结果进行操作以删除其第一列?
select *
可以表示select * except for the first column
。答案是不。select *
始终请求该表中的所有列。如果需要子集,则必须拼出所需的列。
选择的ID将与插入表中的ID相同。如果您要复制现有行,将导致错误。
Bill Karwin:在您询问之前,SQL中没有“ select *除了一列”的语法。
这可以通过一些创造力来实现:
SET @sql = CONCAT('INSERT INTO <table> SELECT null,
', (SELECT GROUP_CONCAT(COLUMN_NAME)
FROM information_schema.columns
WHERE table_schema = '<database>'
AND table_name = '<table>'
AND column_name NOT IN ('id')), '
from <table> WHERE id = <id>');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
这将导致新行获得一个自动递增的ID,而不是所选行中的ID。