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

Nav*_*oid 211 mysql sql copy insert

我有一张桌子Eg- tab.我要做的是复制一个自动增量列ID = 1的行,并将数据插入到同一个表中,行和列ID = 2.

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

mu *_*ort 318

用途INSERT ... SELECT:

insert into your_table (c1, c2, ...)
select c1, c2, ...
from your_table
where id = 1
Run Code Online (Sandbox Code Playgroud)

c1, c2, ...除了之外的所有列在哪里id.如果要显式插入id2,则将其包含在INSERT列列表和SELECT中:

insert into your_table (id, c1, c2, ...)
select 2, c1, c2, ...
from your_table
where id = 1
Run Code Online (Sandbox Code Playgroud)

当然,你必须id在第二种情况下处理2 的可能重复.

  • @YzmirRamirez,你觉得婚姻本身就是一件坏事.:) (10认同)
  • 同意......根据我的经验,一旦你进入存储过程,你就不会回去 - 你现在已经和那个数据库结婚了,只要你想改变它就会增加成本. (6认同)

par*_*vus 46

IMO,最好似乎只使用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;
Run Code Online (Sandbox Code Playgroud)

另请参见av8n.com - 如何克隆SQL记录

优点:

  • SQL语句2仅提及克隆过程中需要更改的字段.他们不了解 - 或关心 - 其他领域.其他领域只是为了骑行,没有改变.这使得SQL语句更易于编写,更易于阅读,更易于维护和更具可扩展性.
  • 只使用普通的MySQL语句.不需要其他工具或编程语言.
  • your_table在一个原子操作中插入完全正确的记录.

  • 它接缝,这个好的技巧(我喜欢它,但它对我不起作用)不适用于包含TEXT/VARCHAR列的表.我尝试了它并得到:(1163):使用的表类型不支持BLOB/TEXT列.这当然限制了MySQL的使用非常多!可能是,未来这些限制被取消,或者在其他数据库系统上它确实有效,但是现在它实际上是有限的. (3认同)
  • 很多专栏文章的最佳答案。但是`SET id = NULL`可能导致错误`Column'id'不能为null'。应该由“ UPDATE temp_table SET id =(SELECT MAX(id)+1 from your_table的id)”代替; (2认同)

Vij*_*jay 16

说桌子是user(id, user_name, user_email).

您可以使用此查询:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)
Run Code Online (Sandbox Code Playgroud)

  • 在使用INSERT时,您应该**始终**指定列名,否则当架构发生更改时,您将会遇到奇怪且有趣的错误. (26认同)
  • 确实奇怪而有趣。:D (4认同)

Pet*_*dík 10

这有帮助,它支持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;
USE source_table;
Run Code Online (Sandbox Code Playgroud)

  • 我认为如果您有一个包含100个字段的表,那会很好。除非对id可能存在非null约束,否则它会失败 (3认同)
  • 这在哪些方面比这里的其他答案更好? (2认同)

cur*_*mil 7

对于不需要命名列的快速,干净的解决方案,您可以使用如下所述的预准备语句:https: //stackoverflow.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
Run Code Online (Sandbox Code Playgroud)

你可以运行它:

CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');
Run Code Online (Sandbox Code Playgroud)

例子

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
Run Code Online (Sandbox Code Playgroud)

免责声明:此解决方案仅适用于经常在多个表中重复复制行的人.在流氓用户手中可能是危险的.


Nat*_*les 6

如果您能够使用 MySQL Workbench,则可以通过右键单击该行并选择“复制行”,然后右键单击空行并选择“粘贴行”,然后更改 ID,然后执行此操作单击“应用”。

复制该行:

在此输入图像描述

将复制的行粘贴到空白行中:

在此输入图像描述

更改ID:

在此输入图像描述

申请:

在此输入图像描述


小智 5

insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;
Run Code Online (Sandbox Code Playgroud)

  • 这比这里的其他答案更好吗? (3认同)
  • @smar imo 它更容易理解 (2认同)