2016-03-18 10 views
0

の作成I持っている私のデータベースで次の3つのフィールド:mysqlの挿入/更新の整合性トリガー

  • 誕生
  • 場所

  • composite_index

私はこれらに固有の制約を設定したいので、 e。次は許可されていません。

"David-20140101-NULL" 
"David-20140101-NULL" 

私は(''のような)実際の値としてNULLをカウントしたいので、私はALTER TABLE ADD UNIQUE KEY (name,birth,location)を行うことはできません。 compositive_indexヘルパーフィールドを更新するには、上記にINSERT+UPDATEトリガーを追加するにはどうすればよいですか?

+0

@NorbertvanNobelen ok、私は追加の 'composite_index'を質問に追加しました。どうすればそれをやることができますか? – David542

+0

@NorbertvanNobelenクール - それを回答として投稿して、SQLでそれを受け入れることができますか? – David542

+0

あなたは非収縮性を拘束しようとしています。もしこれがあなたの望むならば、未設定の場所のマーカがNULLではなく自動的に値 ' - 'になるように、単に 'NOT NULL DEFAULT '-''という場所の列を簡単に作ることができます。 –

答えて

1

mysqlには関数ベースのインデックスはまだありませんので、トリガーで管理できるヘルパーカラム(名前はcomposite_indexなど)を作成する必要があります。このヘルパー列には、独自の要件を満たす完全なインデックスが用意されています。

この場合、2つのトリガーを作成する必要があります。挿入トリガーと更新前トリガー。これらは、次のようにそこにラインを持っている必要があります。この{yourvalues}で

CREATE TRIGGER {unique triggername} AFTER INSERT ON {table} 
BEGIN 
UPDATE {table} SET composite_index=CONCAT(yourvalues) WHERE id=new.id; 
END; 

CREATE TRIGGER {unique triggername} BEFORE UPDATE ON {table} 
BEGIN 
UPDATE {table} SET composite_index=CONCAT({yourvalues}) WHERE id=new.id; 
END; 

new.{columnname}

あるプラスあなたは1つの一意のインデックスを追加する必要があります。今

CREATE INDEX idx_un_1 ON {table}(composite_index); 

にこのインデックスをレコードを重複して挿入できないようにする

  • updatebeforeが仕事と最高ですますの場合:アップデートが実行され、高速に失敗する前に、更新が一意にチェックされているその方法あなたが一意性競合を持っている場合。
  • insert私はそれがアフタートリガーでなければならないと思う)。
関連する問題