Mysql

在 MySQL 中使列不可變

  • June 4, 2018

出於一致性原因,我想在關係中創建一個不可修改的列。

背景故事是我有一個: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 所提到的,用舊值覆蓋新值也是一個不錯的選擇。

引用自:https://dba.stackexchange.com/questions/8360