我想要一個條件,即藝術家或任務中的事件為空,但即使它有藝術家,它也會拒絕分配。
觸發:
delimiter $$
CREATE TRIGGER assignment_event_or_artist BEFORE INSERT ON assignment
FOR EACH ROW
BEGIN
IF(
(NEW.event IS NULL AND NEW.artist IS NULL) ||
(NEW.event IS NOT NULL AND NEW.artist IS NOT NULL)
)
THEN
SIGNAL SQLSTATE '44000'
SET MESSAGE_TEXT = 'new assignment does not have an event xor an artist';
END IF;
END$$
delimiter ;
那作業:
INSERT INTO assignment(edition, festival, artist, category) VALUES ("2021", "Le Guess Who?", "Bent Arcana", "SOLL");
錯誤代碼:
ERROR 1644 (44000) at line 487: new assignment does not have an event xor an artist
我究竟做錯了什么?
編輯:正如 solarflare 在他的回答中指出的那樣,分配的表定義很重要,所以我在這里包括它:
CREATE TABLE assignment ( edition YEAR NOT NULL, festival VARCHAR(200) NOT NULL, event INT, artist VARCHAR(200), category VARCHAR(200), PRIMARY KEY (edition, festival, event, artist);
uj5u.com熱心網友回復:
根據您的評論,兩者event和artist都是主鍵的一部分:
CREATE TABLE assignment (
edition YEAR NOT NULL,
festival VARCHAR(200) NOT NULL,
event INT,
artist VARCHAR(200),
category VARCHAR(200),
PRIMARY KEY (edition, festival, event, artist), ... )
主鍵不能包含null值,如果您不提供默認值,通常會收到錯誤訊息
Field 'event' doesn't have a default value
如果您希望能夠遇到event或者artist必須是的情況null,您需要修復您的主鍵。
要解釋為什么您沒有收到該錯誤,而是您的信號訊息,有一些可能的原因:
如果您沒有啟用嚴格的 sql 模式,MySQL 會用隱式默認值替換缺失值(在這種情況下,它會
null用 a替換0,因此觸發器中的兩列都不為空)即使您設定了嚴格模式,最高 5.6 的 MySQL 對未指定非 null 的主鍵列使用隱式默認值(與您正在使用的表定義匹配):
例外:如果列被定義為 PRIMARY KEY 的一部分但未顯式定義為 NOT NULL,則 MySQL 將其創建為 NOT NULL 列(因為 PRIMARY KEY 列必須為 NOT NULL),但也會使用隱式默認值為其分配 DEFAULT 子句價值。
- 如果您使用的是 MariaDB,它可能是未修復的MariaDB 錯誤的副作用(這是由
null內部替換為的類似行為引起的0)。
因此,通過這些(或類似)效果之一,在觸發器內部,event已賦予 value 0,因此兩列都not null滿足您的if條件。您實際上可以0在該if陳述句中進行測驗。
但要再次強調:根本問題是主鍵列不能是null,因此無論如何您的測驗都無關緊要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/418292.html
標籤:
上一篇:SQLUPDATE基于COUNT
