我遇到一个问题,MySQL 触发器中的 SELECT INTO 查询对于应正确获取的值返回 NULL。
这是我的触发代码:
BEGIN
DECLARE program_price DECIMAL(10, 2);
DECLARE payment_type enum('Full', 'Installment');
DECLARE program_duration_months INT;
DECLARE amount DECIMAL(10, 2);
DECLARE details VARCHAR(255);
DECLARE payment_due DATE;
-- Log start of trigger execution
INSERT INTO debug_table (debug_message) VALUES ('Trigger execution started.');
-- Fetch program details
INSERT INTO debug_table (debug_message)
VALUES (CONCAT('Fetching program details for program_code: ', NEW.program_code));
SELECT price, payment_type
INTO program_price, payment_type
FROM Programs
WHERE program_code = NEW.program_code;
INSERT INTO debug_table (debug_message)
VALUES (CONCAT('Fetched program details for program_code: ', NEW.program_code));
-- Log fetched values
INSERT INTO debug_table (debug_message)
VALUES (CONCAT('Fetched values - program_price: ', program_price, ', payment_type: ', payment_type, ', program_duration_months: ', program_duration_months));
INSERT INTO debug_table (debug_message) VALUES ('Trigger execution completed.');
END
触发器执行成功,但当运行 SELECT INTO 时,program_price、 payment_type 和program_duration_months 的值始终返回为 NULL。我检查了Programs表中的program_code,它存在,并且值的大小写敏感度没有问题(我已经测试过这一点)。
我尝试过的事情:
“程序”表具有以下预期数据:
program_price = 499.99
payment_type = 'Installment'
您的触发器有两个问题。
首先,
program_duration_months
局部变量没有被赋予任何值,也没有默认值。所以默认为NULL。如果任何参数为 NULL,则CONCAT()
返回 NULL。
其次,您将
payment_type
变量命名为与表的列相同。所以它是不明确的,MySQL 不知道你指的是哪个payment_type
。因此,对 payment_type
的引用是列,而不是变量。
要解决后一个问题,请将局部变量命名为与该表中的列名称不同的名称。
例如,我用这些更改测试了触发器:
BEGIN
...
DECLARE v_payment_type enum('Full', 'Installment'); -- change variable name
DECLARE program_duration_months INT DEFAULT 0; -- give variable a default value
...
SELECT price, payment_type
INTO program_price, v_payment_type
FROM Programs
WHERE program_code = NEW.program_code;
...
INSERT INTO debug_table (debug_message)
VALUES (CONCAT('Fetched values - program_price: ', program_price,
', payment_type: ', v_payment_type,
', program_duration_months: ', program_duration_months));
...
END