在 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 中插入一个新行,其值为 :
- 引用一行Assemblage的外键
- 所有其他属性的值,除了 'Nom_Bicyclette' 和 'Grandeur_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,以便了解如何设置分隔符。
我在 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 中插入一个新行,其值为 :
- 引用一行Assemblage的外键
- 所有其他属性的值,除了 'Nom_Bicyclette' 和 'Grandeur_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,以便了解如何设置分隔符。