【问题标题】:Mysql Clone Row With Primary Key带有主键的Mysql克隆行
【发布时间】:2010-01-18 01:40:09
【问题描述】:

我有一个 Mysql 表,它有一个自动递增的主键(称为 pkey),我想克隆一行,保持所有数据相同,除了应该成为下一个可用值的主键由自动增量定义。

我的第一个问题是,下面的查询可能吗?

UPDATE `table` SET pkey='next_available_primary_key' WHERE pkey='old_primary_key'

如果尝试过

UPDATE `table` SET pkey=null WHERE pkey='old_primary_key'

但它只将主键的值设置为零。提前感谢您的任何帮助/建议。

更新:

我想我应该补充一点,我真的不想要表中数据的两个副本。我只想更改主键。因此,如果我要使用 INSERT SELECT 我将不得不使用 ON DUPLICATE KEY UPDATE pkey='next_available_primary_key' 来补偿我只是不知道该怎么做......

【问题讨论】:

  • 出于好奇:您的目标是什么?因为您可能会误用主键来实现某些非预期目标(例如排序数据)。

标签: mysql clone row


【解决方案1】:

如果您要在表中创建新行,则需要 INSERT,而不是 UPDATE。

这个怎么样?确保您的 PKEY 设置为自动增量。

INSERT INTO `table` (col,col,col)  /*name all the columns EXCEPT the primary key*/
SELECT col,col,col  /*name all the columns EXCEPT the primary key*/
  FROM 'table`
 WHERE pkey='old_primary_key'

【讨论】:

  • 所以我想到了这个,我可能会使用这个解决方案,但我希望有一个更干净的解决方案,我不需要列出除主键之外的所有字段。
  • 我做了很多这样的事情,我使用元数据 (information_schema.COLUMNS) 来构建我的查询。 COLUMNS.COLUMN_KEY = 'PRI' 如果该列是表的主键的一部分,如果不是则为空字符串。
  • 无论如何,您都必须使用一些脚本来构建查询。而且我认为您还必须使用临时表,具体取决于您的数据库引擎。
【解决方案2】:
insert into t select 0,a,b,c,d,e from t where id = some_id

使用 0 作为 auto_increment 列的值,mysql 将使用下一个可用的...

为您的新评论编辑,如果您想将 id 更改为下一个可用的,

update tbl set id = (select auto_increment from
  information_schema.tables where  table_name = 'tbl') where id = 4;

【讨论】:

    【解决方案3】:

    clone-sql-record找到的解决方案怎么样?

    CREATE TEMPORARY TABLE %1 ENGINE=MEMORY SELECT * FROM mytable WHERE myid=%2;
    
    UPDATE %1 SET myid=%3;
    
    INSERT INTO mytable SELECT * FROM %1;
    
    DROP TABLE %1;
    

    在哪里

    • %1 是“T”+raw_time_stamp,前 T20120124132754
    • %2 是旧 ID
    • %3 是新的

    【讨论】:

      【解决方案4】:

      使用自增主键克隆表记录

      CREATE TEMPORARY TABLE `tmp` SELECT * FROM `your_table_name`;
      
      UPDATE `tmp` SET id = NULL ;
      
      INSERT INTO `your_table_name` SELECT * FROM `tmp`;
      
      DROP TEMPORARY TABLE IF EXISTS `tmp`;
      

      【讨论】:

        【解决方案5】:

        请注意,给出的其他解决方案似乎适用于允许主键列为 null 的源表。因为这对我来说不是这种情况,所以我遇到了一个错误——这可以通过更改临时表轻松解决(我希望 id 是主键):

        CREATE TEMPORARY TABLE tmp_clone ENGINE=MEMORY 
            SELECT * FROM my_source_table WHERE id=some_id;
        
        ALTER TABLE tmp_clone MODIFY id bigint(20) default null;
        UPDATE tmp_clone SET id=null;
        
        INSERT INTO my_source_table SELECT * FROM tmp_clone;
        
        DROP TABLE tmp_clone;
        
        SELECT * from my_source_table where id = last_insert_id();
        

        【讨论】:

          猜你喜欢
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-26
          • 2013-07-17
          • 2012-06-28
          • 2011-08-06
          • 1970-01-01
          • 2015-05-06
          相关资源
          最近更新 更多