【问题标题】:Mysql trigger on Delete to multiple tables (also error 1235)删除多个表时的 Mysql 触发器(也是错误 1235)
【发布时间】: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


【解决方案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_ 的主键。这将从learned_skills 表中删除所有<field>character_ 被删除的内容。

【讨论】:

  • 是的,一条语句就足够了,因为触发器语句中的DELETE 将删除与WHERE 子句匹配的所有行。
  • 非常感谢@dub stylee,但是如果该表中的两个字段是主键(复合键)怎么办?
  • learned_skills 表中的字段是什么,可能是character_ 的ID 和skill 的ID,对吧?您无需担心skill 的ID,因为您只是删除了与正在删除的character 的ID 匹配的行。如果您想了解更多细节,请继续使用您想知道的特定字段更新您的问题。
  • 问题已更新,我已尝试创建触发器 delete_char_ AFTER DELETE ON character_ FOR EACH BEGIN DELETE FROMlearned_skills WHERE learn_skills.Name_ = old.Name_;结尾;但在 old.Name_ 和 END 中出现语法错误,它说意外结束
  • 看来您需要将 WHERE 子句设为 WHERE learned_skills.Character_Name = old.Name_;
猜你喜欢
  • 2020-11-20
  • 2021-07-29
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2012-08-02
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多