我正在处理与数据库中的人员重叠的超/子类型关系。我想做的是让重叠的子类型在超类型获得新行时插入新行。我已附上我的LRD来澄清这种关系。 LRD 我想创建一个触发器,根据人员表中的雇员/用户属性,将新人员行插入正确的子类型中。 到目前为止,我尝试过的代码在将行插入到人员中时提示我“雇员列不存在”时出现错误。我认为这是因为这段代码试图将if语句用于实际上不存在的子类型。
我将不胜感激。 表格详细信息
DELIMITER //
CREATE TRIGGER subtype_creator
AFTER INSERT ON PERSON
FOR EACH ROW
BEGIN
IF (employee = ‘e’ ) THEN
INSERT INTO EMPLOYEE
SET eperson_id = NEW.person_id,
last_name = NEW.last_name,
enterprise_email = NULL,
manager_id = NULL;
IF (participant = ‘p’ )THEN
INSERT INTO PARTICIPANT
SET pperson_id = NEW.person_id,
city=NULL,
state = NULL,
zip = NULL,
sign_up_date =NULL,
termination_date = NULL;
END IF;
END IF;
END//
DELIMITER ;
触发代码
44+55+66=165
答案 0 :(得分:0)
这可能对您有用。
首先,我认为不需要在列AUTO_INCREMENT
和EMPLOYEE.eperson_id
上使用PARTICIPANT.pperson_id
属性。
由于这两个列均为FOREIGN KEYS
并返回到表person_id
的{{1}}列,因此它们需要并且将一直从该列获取值PERSON
无论如何,因此无需在表中对其进行自动递增。
所以我会改变它。
此TRIGGER
应该适用于在表TRIGGER
的{{1}}之后填充表EMPLOYEE
和PARTICIPANT
:
INSERT
希望这对您有所帮助。
答案 1 :(得分:0)
我最终想出了两种方法来解决我的问题。我最终将“雇员”和“参与者”更改为布尔/ tinyint数据类型。
CREATE TABLE PERSON
(person_id int(10) not null AUTO_INCREMENT,
first_name varchar(15) not null,
last_name varchar(15) not null,
employee tinyint(1),
participant tinyint(1),
CONSTRAINT person_pk PRIMARY KEY (person_id))
ENGINE=InnoDB;
在进行了更改之后,我决定尝试将一个触发器分成两个部分。成功了。
类型1
DELIMITER //
CREATE TRIGGER employee_creator
AFTER INSERT ON PERSON
FOR EACH ROW
BEGIN
IF (NEW.employee = 1 ) THEN
INSERT INTO EMPLOYEE
SET eperson_id = NEW.person_id,
last_name = NEW.last_name,
enterprise_email = NULL,
manager_id = NULL;
END IF;
END//
DELIMITER ;
DELIMITER //
CREATE TRIGGER participant_creator
AFTER INSERT ON PERSON
FOR EACH ROW
BEGIN
IF (NEW.participant =0 )THEN
INSERT INTO PARTICIPANT
SET pperson_id = NEW.person_id,
city=NULL,
state = NULL,
zip = NULL,
sign_up_date =NULL,
termination_date = NULL;
END IF;
END//
DELIMITER ;
在添加了第一个选项后,我意识到ELSEIF将使我不必将两者分开而创建单个触发器。
类型2
DELIMITER //
CREATE TRIGGER employee_creator
AFTER INSERT ON PERSON
FOR EACH ROW
BEGIN
IF (NEW.employee = 1 ) THEN
INSERT INTO EMPLOYEE
SET eperson_id = NEW.person_id,
last_name = NEW.last_name,
enterprise_email = NULL,
manager_id = NULL;
ELSEIF (NEW.participant =0 )THEN
INSERT INTO PARTICIPANT
SET pperson_id = NEW.person_id,
city=NULL,
state = NULL,
zip = NULL,
sign_up_date =NULL,
termination_date = NULL;
END IF;
END//
DELIMITER ;