2016-03-18 37 views
0

我有我的數據庫中以下三個領域:創建MySQL插入/更新完整性觸發

  • 出生
  • 位置

  • composite_index

我想對這些設置一個唯一的約束,所以那個Ë以下是不允許的:

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

因爲我想算NULL作爲一個實際值(如''),我不能這樣做ALTER TABLE ADD UNIQUE KEY (name,birth,location)。我如何在上面添加一個INSERT+UPDATE觸發器來更新compositive_index助手字段?

+0

@NorbertvanNobelen好的,我在附加的'composite_index'中添加了問題。那我會怎麼做呢? – David542

+0

@NorbertvanNobelen酷 - 你可以張貼作爲答案,我會接受與SQL。 – David542

+0

你試圖限制不可抑制的。如果這是你想要的,你可以輕鬆地將位置列設置爲'NOT NULL DEFAULT'-'',這樣未設置位置的標記自動爲值' - '而不是NULL。 –

回答

1

由於在mysql中仍然沒有基於函數的索引,所以您將不得不創建一個幫助列(名稱,例如composite_index)(您可以使用觸發器進行管理)。然後,這個幫助者列具有唯一索引,充分滿足您的需求。

爲此,您將不得不創建兩個觸發器。插入觸發器和更新前觸發器。這些都需要有一條線在那裏如下:

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; 

在此{yourvalues}是new.{columnname}

另外,你必須添加一個唯一索引:現在

CREATE INDEX idx_un_1 ON {table}(composite_index); 

該指數確保記錄不能作爲重複插入

您必須查看它是否需要在觸發器之前或之後:

  • updatebefore將工作,最好是:通過這種方式被執行前的更新和失敗快速更新是在獨特性檢查,當你有一個獨特性衝突;
  • 對於insert我認爲它必須是一個後觸發器)。