2017-10-19 14 views
0

これを行う方法はありますか?考えると、私は次の表があります。私は予想通りIntegrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'得る値(1, "C")を挿入しようとidを考慮すると、Mysqlは、重複キーに挿入する値を変更します

id | value 
----|------ 
1 | A 
2 | B 

は、一意の主キーです。だから、私は次のINSERT構文でAFTER INSERT ONトリガー内部の次のインサートを使用してみました:

INSERT INTO table VALUES (NEW.id, NEW.value) 
ON DUPLICATE KEY UPDATE NEW.id = NEW.id + 5000; 

これは、重複キーエラーを削除しますが、それだけで重複した1(複数可)を挿入しません。

私はYogiの提案に従った手順を作成しました。これは、次のようになります。

DELIMITER // 
CREATE PROCEDURE set_keys(IN id INT, IN value char(1)) 
BEGIN 
    DECLARE CONTINUE HANDLER FOR 1062 
    SELECT concat('Duplicate keys detected: ',id,', ',value) AS msg; 

    INSERT INTO tests (id, value) VALUES(id + 5000, value); 
END; 
// 

はそれを行うための適切な方法で、今からCALL set_keys(NEW.id, NEW.value);をしているのですか?

+0

が自動インクリメントキーを使用するように簡単ではありません再びINSERT声明をRE_RUN? P.S.あなたは1-Aが5001-Aになり、1-Cが失われるので、新しい行を挿入しないでください。 –

+0

@RobertoBiselloしかし、私はデータをインポートしています。別のデータベースであり、挿入を除いて元のものを変更することはできません。他のデータベースが私に1-Cを与えるならば、それを挿入して、両方の値を 'value'カラムから保つことができます。 – Newwt

答えて

1

直接ではなく、テーブルにINSERT を行い、
あなたはこの使用PROCEDURE/FUNCTIONを行うことができます。

実行(Do)例外処理DUPLICATE KEYエラー下EXCEPTIONブロックのために、KEY列をインクリメントし、

+0

'何番のテーブルからカウント(*)を選んでid = @ id_to_insert'のようにして「if count = 1、add 5000」というような働きをしますか?私は申し訳ありません、私はちょうどそれについて知りません。* /多くのmysqlについて:/ – Newwt

+0

@新聞 - あなたの答えは、すべての挿入の前に私は1つの余分なクエリを実行する前に、重複レコードのみの追加クエリを実行します... – Yogi

+0

私はちょっと自分に知らせました.-私はあなたの提案をしました。質問に私の編集をチェックして、それが正しいかどうかを確認してもらえますか?これまでの助けてくれてありがとう! – Newwt

関連する問題