Mysql触发删除到多个表(也是错误1235)

时间:2014-05-22 17:01:43

标签: mysql triggers sql-delete cascading-deletes

我有3个叫做的表:

  • 字符_
  • learned_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

对于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动作时间和事件的多个触发器

1 个答案:

答案 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表中的任何内容。