我有3个叫做的表:
"字符_"包含字符列表中的某些信息,而表格"技能"禁止一系列技能。 第三张表是每个角色学到的技能列表。
但是我希望能够从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
对于sigle语句是否足够,还是需要多个语句和/或级联?
在这种情况下你会做什么?
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还不支持使用一个表的samme动作时间和事件的多个触发器
答案 0 :(得分:1)
以下是它的样子:
CREATE TRIGGER delete_char_ AFTER DELETE ON character_
FOR EACH ROW
DELETE FROM learned_skills
WHERE learned_skills.Character_Name = old.Name_;
您需要将<field>
替换为character_
的主键。这将删除已删除<field>
的{{1}}的learned_skills表中的任何内容。