簡體   English   中英

使用 if 語句創建觸發器時出現 MySql 錯誤 1064

[英]MySql error 1064 on trigger createion with if statement

下面是代碼。 我想要做的就是檢查報價是否存在,如果不存在,則將記錄插入另一個表中。

DROP TRIGGER IF EXISTS `CB2`;
CREATE TRIGGER CB2
AFTER UPDATE
ON `quotes` FOR EACH ROW
BEGIN
IF (SELECT quoteID FROM booking WHERE quoteID <> new.`quoteID`) THEN
INSERT INTO `booking`(`Book_ID`, `Date`, `CustomerID`, `CustodianID`, `cusCntNum`, `Service`, `sAddress`, `Size`, `Comments`, `Frequency`, `Duration`, `Bdrms`, `Bathrm`, `Living Spaces`, `AppointmentStartDate`, `Time`, `ServiceDay`, `AddOns`, `Fee`, `quoteID`, `uBookingID`) VALUES (NULL, CURRENT_DATE, new.CustAccNum, new.CustodianNum, new.Contact_Number, new.ServType,new.Address, new.CommercialSize, new.Comments, new.Frequency, new.Duration, new.Bedrooms, new.Bathrooms, new.lSpaces, new.AppointmentDate, new.AppointmentTime ,DAYOFWEEK(new.AppointmentTime), new.sAddOns, new.Fee, new.quoteID,'');
END IF;
END

您需要 DELIMITER 以便 mysql 可以識別為什么屬於觸發器

DROP TRIGGER IF EXISTS `CB2`;
DELIMITER //
CREATE TRIGGER CB2
AFTER UPDATE
ON `quotes` FOR EACH ROW
BEGIN
IF (SELECT quoteID FROM booking WHERE quoteID <> new.`quoteID`) THEN
INSERT INTO `booking` 
(`Book_ID`, `Date`, `CustomerID`, `CustodianID`, `cusCntNum`, `Service`, `sAddress`, `Size`, `Comments`, `Frequency`, `Duration`, `Bdrms`, `Bathrm`, `Living Spaces`, `AppointmentStartDate`, `Time`, `ServiceDay`, `AddOns`, `Fee`, `quoteID`, `uBookingID`) VALUES 
(NULL, CURRENT_DATE, new.CustAccNum, new.CustodianNum, new.Contact_Number, new.ServType,new.Address, new.CommercialSize, new.Comments, new.Frequency, new.Duration, new.Bedrooms, new.Bathrooms, new.lSpaces, new.AppointmentDate, new.AppointmentTime ,DAYOFWEEK(new.AppointmentTime), new.sAddOns, new.Fee, new.quoteID,'');
END IF;
END//
DELIMITER ;

您確實需要設置分隔符,但您還需要進行存在檢查。 使用模型的簡化版本

drop table if exists quotes,booking;
create table quotes(quoteid int, val int);
create table booking(quoteid int,val int);

drop trigger if exists t;
delimiter $$

CREATE TRIGGER t
AFTER UPDATE
ON `quotes` FOR EACH ROW
BEGIN
    insert into debug_table(msg) values (new.quoteid);
    IF not exists (SELECT quoteID FROM booking WHERE quoteID = new.`quoteID`) THEN
        INSERT INTO `booking`( `quoteID`,val) VALUES (new.quoteid,new.val);
    END if;
end $$

delimiter ;
truncate debug_table;
insert into quotes(quoteid) values (1),(2);
update quotes set val = 10 where quoteid = 1;
update quotes set val = 20 where quoteid = 1;

MariaDB [sandbox]> select * from booking;
+---------+------+
| quoteid | val  |
+---------+------+
|       1 |   10 |
+---------+------+
1 row in set (0.001 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select * from debug_table;
+----+------+
| id | msg  |
+----+------+
|  1 | 1    |
|  2 | 1    |
+----+------+
2 rows in set (0.001 sec)

您不需要調試表,但它提供了觸發器按預期觸發兩次的證據。 順便說一句,我不相信你的邏輯是合理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM