【发布时间】:2014-05-22 17:01:43
【问题描述】:
我有 3 个表被称为:
- 字符_
- 学习技能
- 技能
“character_”包含有关字符列表的某些信息,而表“skills”包含技能列表。 第三张表是每个角色所学技能的列表。
但是,我希望能够从 character_ 表中删除一个角色,它还会删除该角色的名称以及它从“learned_skills”表中学到的技能。
我假设在这种情况下需要触发器。我知道语法是:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR REACH ROW tigger_statement;
但是我不知道 trigger_statement 应该是什么样子。
CREATE TRIGGER delete_char_ AFTER DELETE ON character_ FOR REACH ROW trigger_statement
一个语句就足够了还是需要多个语句和/或级联?
在这种情况下你会怎么做?
CREATE TABLE character_ (
Name_ varchar (30) NOT NULL,
Class varchar (30),
World_Type varchar (15),
Str integer ,
WS integer ,
BS integer ,
Fel integer ,
Per integer ,
Int_ integer ,
Agi integer ,
WP integer ,
Tough integer ,
PRIMARY KEY (Name_) ,
FOREIGN KEY (Class) REFERENCES Class(Class_name),
FOREIGN KEY (World_Type) REFERENCES World_Type(Name_) );
CREATE TABLE Skills (
SkillName varchar (30) NOT NULL,
Type_ varchar (30),
Characteristic varchar (30),
Descriptor varchar (30),
PRIMARY KEY (SkillName) );
CREATE TABLE Learned_Skills (
Character_Name varchar (30) NOT NULL,
Skill_Name varchar (40) NOT NULL,
PRIMARY KEY (Character_Name,Skill_Name),
FOREIGN KEY (Character_Name) REFERENCES character_(Name_),
FOREIGN KEY (Skill_Name) REFERENCES Talents(TalentName) );
更新:
所以我在理解和制作 DELETE 触发器方面有所帮助,但我发现需要在两个表上创建多个触发器,我知道不可能在两个具有相同触发时间和事件的表上创建触发器,但是有办法解决吗?我需要的是以下内容:
DELIMITER //
CREATE TRIGGER delete_char_ AFTER DELETE ON character_
FOR EACH ROW begin
DELETE FROM learned_skills
WHERE learned_skills.Character_Name = old.Name_;
DELETE FROM learned_talents
WHERE learned_talents.Character_Name = old.Name_;
END;
//
DELIMITER ;
当我运行此代码时,我得到错误代码:
1235,这个版本的mysql还不支持'一个表的动作时间和事件相同的多个触发器
【问题讨论】:
-
阅读Trigger Syntax and Examples 了解更多关于什么是触发器语句。
-
啊,我刚刚注意到您对问题的更新。你不能
CREATE另一个同名的触发器,你必须先去掉旧的,像这样:DROP TRIGGER delete_char_,然后你才能CREATE新的。
标签: mysql triggers sql-delete cascading-deletes