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



Answers

国际海事组织,最好似乎只使用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 - 如何克隆SQL记录

优点:

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

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

使用MySql。 我如何在单个查询中执行此操作?请帮助




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

我找到了解决PL / SQL问题的方法,但我确信任何其他SQL IDE都可以。 我做了一个基本的

SELECT * 
FROM mytable 
WHERE id=42;

然后将它导出到一个SQL文件,我可以找到它

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);



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

来源: 在MySQL中复制行 (请参阅由TRiG提供的第二条评论,由Lore提供给第一个解决方案)




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

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

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

免责声明:此解决方案仅适用于经常会在许多表格中反复复制行的人。 这对流氓用户来说可能是危险的。




将你想要的行转储到sql,然后使用生成的SQL,减去ID列导入它。




Links