如何复制一行,并在MySQL中的自动增量字段插入在同一个表中?

我有一个表格。 我想要做的是复制一个自动增量列ID = 1的行,并插入到行和列ID = 2相同的表中的数据。

使用MySql。 我怎样才能在一个查询中做到这一点?请帮助

使用INSERT ... SELECT

 insert into your_table (c1, c2, ...) select c1, c2, ... from your_table where id = 1 

其中c1, c2, ...id以外的所有列。 如果你想显式插入一个2的id ,那么把它包含在你的INSERT列表和你的SELECT中:

 insert into your_table (id, c1, c2, ...) select 2, c1, c2, ... from your_table where id = 1 

当然,在第二种情况下,您必须注意可能的重复id为2的情况。

国际海事组织,最好似乎使用SQL语句只复制该行,而同时只引用您必须和想要更改的列。

 CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY SELECT * FROM your_table WHERE id=1; UPDATE temp_table SET id=NULL; /* Update other values at will. */ INSERT INTO your_table SELECT * FROM temp_table; DROP TABLE temp_table; 

另请参阅av8n.com – 如何克隆SQLlogging

优点:

  • SQL语句2仅提及在克隆过程中需要更改的字段。 他们不知道或关心其他领域。 其他领域只是一路顺风,不变。 这使得SQL语句更容易编写,更易于阅读,更易于维护和扩展。
  • 只有普通的MySQL语句被使用。 没有其他工具或编程语言是必需的。
  • 一个完全正确的logging插入your_table在一个primefaces操作。

说这个表是user(id, user_name, user_email)

你可以使用这个查询:

 INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1) 

对于不需要命名列的快速,干净的解决scheme,可以使用准备好的语句,如下所述: https : //stackoverflow.com/a/23964285/292677

如果你需要一个复杂的解决scheme,所以你可以经常这样做,你可以使用这个过程:

 DELIMITER $$ CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text) SQL SECURITY INVOKER BEGIN SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns; SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns; SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')', 'SELECT ', @columns, ' FROM ', _schemaName, '.', _tableName, ' ', _whereClause); PREPARE stmt1 FROM @sql; EXECUTE stmt1; END 

你可以运行它:

 CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional'); 

例子

 duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200 duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column duplicateRows('acl', 'users'); -- will duplicate all records in the table 

免责声明:此解决scheme仅适用于经常在多张表格中反复复制行的人。 在stream氓用户的手中可能是危险的。

您也可以传递'0'作为列自动递增的值,创buildlogging时将使用正确的值。 这比临时表容易得多。

来源: 在MySQL中复制行 (见TRore的第二个评论,由Lore提供给第一个解决scheme)

 insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id; 

这帮助了我很多,它支持BLOB / TEXT列。

 CREATE TEMPORARY TABLE temp_table AS SELECT * FROM source_table WHERE id=2; UPDATE temp_table SET id=NULL' WHERE id=2; INSERT INTO source_table SELECT * FROM temp_table; DROP TEMPORARY TABLE temp_table; 

我正在寻找相同的function,但我不使用MySQL。 我想复制除了主键(id)以外的所有字段。 这是一个单一的查询,不用于任何脚本或代码。

我发现我的PL / SQL的方式,但我相信任何其他的SQL IDE会做。 我做了一个基本的

 SELECT * FROM mytable WHERE id=42; 

然后将其导出到一个SQL文件,我可以find

 INSERT INTO table (col1, col2, col3, ... , col42) VALUES (1, 2, 3, ..., 42); 

我刚刚编辑并使用它:

 INSERT INTO table (col1, col2, col3, ... , col42) VALUES (mysequence.nextval, 2, 3, ..., 42); 

我倾向于使用什么mu过短的变化张贴:

 INSERT INTO something_log SELECT NULL, s.* FROM something AS s WHERE s.id = 1; 

只要这些表具有相同的字段(除了日志表上的自动增量),那么这很好地工作。

由于我尽可能使用存储过程(为了让不熟悉数据库的其他程序员的工作变得更轻松),这就解决了每次向表中添加一个新字段时必须返回并更新过程的问题。

它还可以确保如果你添加新的字段到表中,他们将立即开始出现在日志表中,而不必更新你的数据库查询(除非你有一些明确的设置字段)

警告:您将要确保同时添加任何新的字段到两个表,以便字段顺序保持不变,否则你会开始得到奇怪的错误。 如果你是唯一一个写数据库接口的人,你非常小心,那么这个工作很好。 否则,坚持命名所有的领域。

注意:除此之外,除非您正在开发一个独立的项目,而您确定不会有其他项目正在开发,否则应坚持列出所有字段名称,并在模式更改时更新日志语句。 这种快捷方式可能不值得长期头痛,尤其是在生产系统上。