在 Mysql 中插入后创建触发器时出错

Error creating Trigger After Insert in Mysql

我在 mysql(在 phpmyadmin 上)创建触发器时卡住了,这就是我来寻求您帮助的原因

我有 2 tables : Assemblage 和 Bicyclette。

Tables 图:

组合是这样构建的:

CREATE TABLE `Assemblage` (  
 `ID_Assemblage` int(11) NOT NULL AUTO_INCREMENT,  
 `Nom_Assemblage` varchar(255) NOT NULL,  
 `Grandeur_Assemblage` enum('Dames','Hommes','Garçons','Filles','Adultes','Jeunes') NOT NULL,  
 `Cadre_Assemblage` varchar(10) NOT NULL,  
 `Guidon_Assemblage` varchar(10) NOT NULL,  
 `Freins_Assemblage` varchar(10) DEFAULT NULL,  
 `Selle_Assemblage` varchar(10) NOT NULL,  
 `DerailleurAvant_Assemblage` varchar(10) DEFAULT NULL,  
 `DerailleurArriere_Assemblage` varchar(10) DEFAULT NULL,  
 `RoueAvant_Assemblage` varchar(10) NOT NULL,  
 `RoueArriere_Assemblage` varchar(10) NOT NULL,  
 `Reflecteurs_Assemblage` varchar(10) DEFAULT NULL,  
 `Pedalier_Assemblage` varchar(10) NOT NULL,  
 `Ordinateur_Assemblage` varchar(10) DEFAULT NULL,  
 `Panier_Assemblage` varchar(10) DEFAULT NULL,  
 PRIMARY KEY (`ID_Assemblage`)  
)  

这里是 Bicyclette:

CREATE TABLE `Bicyclette` (  
 `ID_Bicyclette` int(11) NOT NULL AUTO_INCREMENT,  
 `ID_Assemblage` int(11) NOT NULL,  
 `Prix_Bicyclette` float NOT NULL,  
 `Categorie_Bicyclette` enum('VTT','Vélo de course','Classique','BMX') NOT NULL,  
 `DateIntroduction_Bicyclette` date NOT NULL,  
 `DateFin_Bicyclette` date NOT NULL,  
`Nom_Bicyclette` varchar(255) DEFAULT NULL,    
 `Grandeur_Bicyclette` 
 enum('Dames','Hommes','Garçons','Filles','Adultes','Jeunes') DEFAULT NULL,   
 PRIMARY KEY (`ID_Bicyclette`),  
 KEY `ID_Assemblage` (`ID_Assemblage`),  
 CONSTRAINT `ID_Assemblage` FOREIGN KEY (`ID_Assemblage`) REFERENCES `Assemblage` (`ID_Assemblage`) ON DELETE CASCADE ON UPDATE CASCADE
)    

触发操作:

我希望在 Bicyclette 中插入一个新行,其值为 :

借助外键 ID_Assemblage[=15=,触发器使用来自 Assemblage 的相应数据插入 'Nom_Bicyclette' 和 'Grandeur_Bicyclette' ]

下面是一个向 Bicyclette 中插入数据的例子:

插入 Bicyclette 值(102、547.8、“VTT”、01/01/2022、01/01/2023)

其中102是tableAssemblage中的装配模型。 所以我希望我的触发器执行此操作(对于此示例):

DECLARE @name VARCHAR  
DECLARE @size VARCHAR  

@name = SELECT Nom_Assemblage FROM Assemblage WHERE ID_Assemblage = 102  
@size = SELECT Grandeur_Assemblage FROM Assemblage WHERE ID_Assemblage = 102  

UPDATE Bicyclette SET Nom_Bicyclette=@name, Grandeur_Bicyclette=@size 
WHERE ID_Bicyclette = INSERTED.ID_Bicyclette  

这是一个图表,可以更好地形象化所需的效果: Schema for trigger

提前感谢您的帮助!

(它可能看起来很特别,但我必须有字段 'Nom_Bicyclette' 和 'Grandeur_Bicyclette' 对应于我的 Bicyclette Table 中的外键 ID_Assemblage。)

create trigger Bicyclette_copy_attributes 
before insert on Bicyclette
for each row begin
  declare name varchar(255);
  declare size varchar(255);

  select Nom_Assemblage, Grandeur_Assemblage into name, size from Assemblage
  where ID_Assemblage = NEW.ID_Assemblage;

  set NEW.Nom_Bicyclette = name;

  set NEW.Grandeur_Bicyclette = size;
end

在MySQL中,与其他品牌的SQL数据库在语法上存在差异:

  • DECLARE 变量不使用 @ 印记。

  • 如果需要更改插入行中的列,请使用 BEFORE 触发器。如果您编写 AFTER 触发器,则为时已晚,因为该行已被插入。

  • 使用 SET NEW.<column> 而不是 UPDATE 更改列。 NEW 关键字引用即将插入的行。

  • 触发器主体中的所有语句都需要以分号结束(;)。

如果您使用 MySQL 客户端执行 create trigger,请阅读 https://dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html,以便了解如何设置分隔符。