如何在Insert触发器中使用IF

  • 本文关键字:IF 触发器 Insert mysql
  • 更新时间 :
  • 英文 :


我有两个表中的人和用户,每个注册或按类型插入用户"应用程序";默认值。它将自动执行插入person的语句。然后取最后一个id并更新到user.person_id FK中;字段列表中的未知表"user";。我测试了很多组合。如CCD_ 1。CCD_ 2。user_type。它给出了其他错误。如何在insert中或在这种情况下准确访问表?

表定义

person table
=======
person_id PK
firstname DEFAULT NULL
lastname DEFAULT NULL
user polymorphism table 
=======
user_id PK
username
password
user_type DEFAULT app
person_id FK

触发

CREATE TRIGGER UserAFTER_INSERT AFTER INSERT ON `user` FOR EACH ROW
BEGIN
IF (`user.user_type` = "app") THEN
INSERT INTO `person` VALUES ();      
SET @personId := SELECT `person_id` FROM `person` ORDER BY `person_id` DESC LIMIT 1; 
UPDATE `user` SET `person_id` = @personId;
END IF;
END

触发器中存在多个问题。第一个答案是,您将新创建的用户行(因为这是用户表上的触发器(称为NEW。

IF (NEW.user_type = "app") THEN

但是,您很快就会遇到这样一个事实,即无法更新触发器中新创建的行。

您不需要这样做,而且要在数据库中实现子类型结构,您不应该在user中有person_id行。

您要做的是使人员行的主键与用户行的主键相同。这就是他们之间的联系。从技术上讲,这被称为一对一关系。

从User中删除person_id,并实现这样的触发器:

CREATE TRIGGER UserAFTER_INSERT AFTER INSERT ON `user` FOR EACH ROW
BEGIN
IF NEW.user_type = "app" THEN
INSERT INTO person (person_id, firstname, lastname) VALUES (NEW.user_id, '', '');           
END IF;
END

当您创建新的子类型表时,您可能会使用其他子类型(user.user_type(的类似插入来更新此触发器。

最新更新