2010-01-18 48 views
4

我有一個帶有單個主鍵(稱爲pkey)的自動遞增的Mysql表,我想克隆一行,保持所有數據相同,除了主鍵成爲由自動增量定義的下一個可用值。有主鍵的Mysql克隆行

我的第一個問題是,下列查詢可能嗎?

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

如果試圖

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

但只設置主鍵到零值。提前感謝任何幫助/建議。

UPDATE:

我想我應該補充一點,我真的不希望在表中的數據的兩個副本。我只是想改變主鍵。所以,如果我是使用INSERT SELECT我將不得不使用對重複密鑰更新PKEY補償=「next_available_primary_key」我只是不知道如何做到這一點...

+0

出於好奇:什麼是你的目標?因爲您可能會濫用主鍵來實現某些目標(如訂購數據),而不是其目的。 – 2010-01-18 04:09:57

回答

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

你想INSERT,不更新,如果你正試圖在表格中創建一個新行。

這個怎麼樣?確保您的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' 
+0

所以我想到了這一點,我可能會使用這種解決方案,但我希望有一個更清潔的解決方案,我不需要列出除主鍵以外的所有字段。 – 2010-01-18 01:55:16

+2

我做了很多這種東西,我使用元數據(information_schema.COLUMNS)來構建我的查詢。列。如果該列是表的主鍵的一部分,則COLUMN_KEY ='PRI',如果不是,則爲空字符串。 – 2010-01-22 11:34:39

+0

無論如何,你將不得不使用一些腳本來建立查詢。 我認爲你將不得不使用臨時表,這取決於你的數據庫引擎。 – 2011-05-26 10:20:36

2

如何解決在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 OLDID
  • %3是NEWID
  • 表的
0

克隆記錄with autoincremented primary key

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`; 
0

請注意,其他解決方案似乎適用於允許主鍵列爲空的源表。由於這是不是這樣的我,我遇到了一個錯誤 - 它可以通過改變臨時表很容易解決(我預計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();