Mysql
MariaDB 和 MySQL - 觸發器未觸發:“欄位 ‘__’ 沒有預設值”(舊錯誤未真正修復?)
我認為我的問題可能是由這個舊的 MySQL 錯誤(和這個: /bug.php?id=6295 )引起的,他們在執行觸發器之前檢查了列約束。但是,根據那個錯誤,他們在幾年前就修復了它。
我最初在 MariaDB v10.1.19 上執行;但根據這張 MariaDB 票證:jira.mariadb .org/browse/MDEV-10002,他們也在 v10.1.6 中修復了這個問題。
我試過了:
[FAILS] -> MariaDB v10.1.19 [FAILS] -> MySQL v5.6 [WORKS] -> MySQL v5.7
我的設置是否存在配置問題導致這在 MariaDB 中不起作用?還是該錯誤自最初修復以來再次被破壞的可能性更大?如果事實證明是我的錯,我不想打擾 MariaDB 開發人員。
問題
我有一個受限視圖,它使用鑑別器列在基表上進行過濾。該視圖不包含鑑別器列。在基表中,此列不允許 NULL 值。
在通過視圖插入數據時,我創建了一個 BEFORE INSERT 觸發器來填充此列,但據我所知,觸發器沒有觸發。將記錄插入視圖時,數據庫會拋出錯誤:
Field 'groupId' doesn't have a default value
我已經嘗試在基表上進行幾次插入測試,看起來觸發器根本沒有觸發。我在網上搜尋了其他有這個問題的人,但他們似乎都只是語法錯誤。我對這種“深度”SQL 沒有太多經驗,但我認為我的做法是正確的。
這是一個範例實現,我還製作了一個SQL Fiddle:
PS對不起,其中有2個帶有空格的連結。StackExchange 不允許我發布超過 2 個連結;顯然,我的聲譽不足 4 分。
CREATE TABLE privateNotes ( id int(11) NOT NULL, userId int(11) NOT NULL, text varchar(500) NOT NULL, groupId int(11) NOT NULL ); INSERT INTO privateNotes (id, userId, text, groupId) VALUES (30, 1, '[John] A Secret Message', 101), (32, 2, '[George] A Secret Message', 101), (34, 3, '[Sarah] A Secret Message', 202), (36, 4, '[Mary] A Secret Message', 202); -- -------------------------------------------------------- -- Get CREATE FUNCTION getCurrentGroupId() RETURNS int(11) NO SQL BEGIN RETURN @currentGroupId; END // -- Set CREATE FUNCTION setCurrentGroupId(groupId_in int(11)) RETURNS int(11) NO SQL BEGIN SET @currentGroupId = groupId_in; RETURN @currentGroupId; END // -- -------------------------------------------------------- CREATE VIEW myPrivateNotes AS SELECT privateNotes.id AS id, privateNotes.userId AS userId, privateNotes.text AS text FROM privateNotes WHERE ( privateNotes.groupId = getCurrentGroupId() /* 101, 202, etc. */ ); -- -------------------------------------------------------- -- Trigger CREATE TRIGGER before_insert_privateNotes BEFORE INSERT ON privateNotes FOR EACH ROW BEGIN IF NEW.groupId IS NULL THEN SET NEW.groupId = getCurrentGroupId(); END IF; END // -- -------------------------------------------------------- -- ------- -- -- TESTS -- -- ------- -- -- View Insert Test SELECT setCurrentGroupId(999); // -- (Uncomment) Error: Field 'groupId' doesn't have a default value -- INSERT INTO privateNotes (id, userId, text) VALUES (50, 51, 'a cool message'); // -- View Select Tests -- -- Copy the full chunk bellow to the Sql box over there -> -- Don't forget to change the delimeter to: [//] SELECT setCurrentGroupId(NULL); // SELECT * from myPrivateNotes; -- Returns Zero Results [Correct] // SELECT setCurrentGroupId(101); // SELECT * from myPrivateNotes; -- Returns Valid Results [Correct] //
我用MariaDB開了一張票。他們已經確認它仍然損壞,並且已將其放入積壓中以修復它。
更新:
票證已在 MariaDB 版本中修復:10.1.21 和 10.2.4