2011-07-11 91 views
0

我想將表中的一行復制到另一個表中。有查詢看起來像這樣在INSERT上忽略MySQL中的重複鍵錯誤

INSERT INTO `quote_block_arc` (`id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends`) SELECT `id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends` FROM `quote_block` WHERE `quote_id` = '41' 

然而,它未能保存有該行復制的鑰匙,是有辦法忽略警告,並運行查詢?

+2

爲什麼你想在你的表中有一個重複的鍵?如果您沒有通過唯一鍵來刪除架構中的約束。如果你需要唯一的密鑰,你不會想要一個重複的密鑰。 – pintxo

+0

@cmmi - 我沒有重複,我從一個表插入數據到另一個。 – dotty

回答

3

發生此錯誤是因爲您已將表中的某一列指定爲UNIQUE。對於此列,您不能有2行具有相同的值。如果您想要替換現有的行,請使用REPLACE而不是INSERT。如果您確實需要列中包含相同值的行,請從該列中刪除UNIQUE修飾符。

使用INSERT IGNORE正如其他一些答案中所述,可以防止發佈錯誤,但不會更新表。

+0

我已經研究過REPLACE,它運作良好。但是,有時候我需要使用REPLACE,其他時候我需要INSERT,有沒有辦法做到「更換或插入INTO」? – dotty

+0

['INSERT ... ON DUPLICATE KEY UPDATE'](http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html) – Naltharial

2

嘗試

INSERT IGNORE INTO `quote_block_arc` (`id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends`) SELECT `id`,`quote_id`,`name`,`description`,`price`,`hours`,`days`,`total_hours`,`is_print`,`amends` FROM `quote_block` WHERE `quote_id` = '41' 
+0

如果有重複鍵錯誤,這將*不*添加條目。 – Naltharial

+0

這個問題表明他想忽略錯誤 – ianbarker

3

您可以執行INSERT IGNORE,或INSERT ... ON DUPLICATE KEY UPDATE 另一種方法是檢查查詢的結果,如果是假的 - 檢查錯誤,如果錯誤代碼爲1062(重複的條目),以繼續執行,就好像沒有錯誤一樣。

1

在具有唯一/主約束的表中存在重複行將違反其完整性。你應該檢查關鍵是什麼,並確認你是否真的需要複製它。例如,傳統上不插入AUTO_INCREMENT主鍵,因爲數據庫會自動填充它。如果id是AUTO_INCREMENT,我會檢查目的地表quote_block_arc。如果是,請將其從INSERT中刪除,並讓MySQL自行插入。

使用INSERT IGNORE將導致您的行而不是被插入。如果要覆蓋重複鍵,請使用REPLACE,但我不推薦使用前面介紹的方法。

0

@cmmi - 我沒有重複,我從一個表插入數據到另一個。

我建議你從目標quote_block_archighestid,你再添加到idSELECT子查詢。這樣,您就知道如何更新引用這些行的其他表中的任何其他相關條目。如果您要讓RDBMS爲您分配新的id,則所有關係都將丟失。