Mysql
在 MySQL 中使列不可變
出於一致性原因,我想在關係中創建一個不可修改的列。
背景故事是我有一個:n 關係,其中“連接”關係具有附加值。我不希望任何人都能夠更改關係夥伴的 ID。
到目前為止我想出了什麼:
創建一個觸發器來檢查 NEW 值是否與 OLD 值相同。但是如果條件證明為 TRUE,我不知道如何拒絕 UPDATE 操作。
到目前為止,這是我的觸發器:
CREATE TRIGGER deny_nton_change BEFORE UPDATE ON Schueler_in_Klasse FOR EACH ROW BEGIN IF NEW.Schueler_ID != OLD.Schueler_ID OR NEW.Klasse_ID != OLD.Klasse_ID THEN END IF; END;
而不是中止更新,只是覆蓋它?
... FOR EACH ROW BEGIN SET NEW.Schueler_ID = OLD.Schueler_ID; SET NEW.Klasse_ID = OLD.Klasse_ID; END
中止並返回可讀錯誤消息的一種相當不錯且乾淨的方法是使用信號:
SIGNAL sqlstate ‘45000’ SET message_text = ‘Schueler_ID 和 Klasse_ID 不得更改!’;
請確保您的 MySQL 版本支持此功能,它是在 MySQL 5.5 中引入的。在早期版本中,您需要一些技巧,例如將不存在的欄位插入到不存在的表中。
正如 gbn 所提到的,用舊值覆蓋新值也是一個不錯的選擇。