Mysql

MariaDB 和 MySQL - 觸發器未觸發:“欄位 ‘__’ 沒有預設值”(舊錯誤未真正修復?)

  • January 18, 2017

我認為我的問題可能是由這個舊的 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

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