首页 文章

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

提问于
浏览
180

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

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

11 回答

  • 6

    我倾向于使用mu过短的变体:

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

    只要表具有相同的字段(除了日志表上的自动增量),这样就可以很好地工作 .

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

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

    Warning: 您需要确保同时向两个表添加任何新字段,以便字段顺序保持不变...否则您将开始获得奇怪的错误 . 如果你是唯一一个编写数据库接口的人并且你非常小心,那么这很好用 . 否则,坚持命名所有字段 .

    Note: 第二个想法,除非您正在开展一个您确定不会让其他人工作的独立项目,否则请明确列出所有字段名称,并在架构更改时更新日志语句 . 这条捷径可能不值得长期头痛......尤其是在 生产环境 系统上 .

  • 2

    我正在寻找相同的功能,但我不使用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

    对于不需要您命名列的快速,干净的解决方案,您可以使用如下所述的预准备语句: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
    

    你可以运行它:

    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
    

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

  • 2

    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;
    

    另见av8n.com - How to Clone an SQL Record

    优点:

    • SQL语句2仅提及克隆过程中需要更改的字段 . 他们不了解 - 或关心 - 其他领域 . 其他领域只是为了骑行,没有改变 . 这使得SQL语句更易于编写,更易于阅读,更易于维护和更具可扩展性 .

    • 仅使用普通的MySQL语句 . 不需要其他工具或编程语言 .

    • 在一个原子操作中, your_table 中插入了完全正确的记录 .

  • 277

    这有帮助,它支持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;
    
  • 0

    您还可以将“0”作为列的值传递给自动递增,创建记录时将使用正确的值 . 这比临时表简单得多 .

    资料来源:Copying rows in MySQL(参见TRiG的第二条评论,由Lore提出的第一个解决方案)

  • 13

    转储您想要的行,然后使用生成的SQL,减去ID列,将其重新导入 .

  • 0
    INSERT INTO `dbMyDataBase`.`tblMyTable` 
    (
        `IdAutoincrement`, 
        `Column2`, 
        `Column3`, 
        `Column4` 
    ) 
    
    SELECT 
        NULL,  
        `Column2`, 
        `Column3`, 
        'CustomValue' AS Column4 
    FROM `dbMyDataBase`.`tblMyTable` 
    WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' 
    ; 
    /* mySQL 5.6 */
    
  • 37

    使用 INSERT ... SELECT

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

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

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

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

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

    说表是 user(id, user_name, user_email) .

    您可以使用此查询:

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

相关问题