MySQL триггер для целевого атрибута столбца - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю с перекрывающимися отношениями супер / подтип, связанными с людьми в моей БД. Я хотел бы, чтобы перекрывающиеся подтипы вставляли новые строки, когда супертип получает новую строку. Я приложил свой LRD, чтобы уточнить отношения. LRD Я хотел бы создать триггер, который вставляет новые строки лиц в правильный подтип на основе атрибутов сотрудник / пользователь в таблице лиц. Код, который я пробовал до сих пор, выдает ошибку при вставке строк в лицо, отмечая «столбец сотрудника не существует». Я предполагаю, что это потому, что этот код пытается использовать оператор if для подтипов, где он фактически отсутствует.

Буду признателен за любые отзывы. Подробности таблицы

    CREATE TABLE PERSON
(person_id int(10) not null AUTO_INCREMENT,
first_name varchar(15) not null,
last_name varchar(15) not null,
employee char(1),
participant char(1),
CONSTRAINT person_pk PRIMARY KEY (person_id))
ENGINE=InnoDB;

CREATE TABLE EMPLOYEE
(eperson_id int(10) not null AUTO_INCREMENT,
enterprise_email varchar(30),
manager_id int(10),
CONSTRAINT employee_pk PRIMARY KEY (eperson_id),
CONSTRAINT employee_fk1 FOREIGN KEY(eperson_id) REFERENCES PERSON(person_id) ON update cascade,
CONSTRAINT employee_fk2 FOREIGN KEY(manager_id) REFERENCES EMPLOYEE(eperson_id) ON update cascade)
ENGINE=InnoDB;

 CREATE TABLE PARTICIPANT
(pperson_id int(10) not null AUTO_INCREMENT,
city varchar(30),
state varchar(2),
zip int(5),
sign_up_date date,
termination_date date,
CONSTRAINT participant_pk PRIMARY KEY (pperson_id),
CONSTRAINT participant_fk FOREIGN KEY(pperson_id) REFERENCES PERSON(person_id) ON update cascade)
ENGINE=InnoDB;

Триггерный код

 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 ; 

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

В итоге я нашел два метода решения моей проблемы. В итоге я изменил своего «сотрудника» и «участника» на типы данных boolean / 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 ;
0 голосов
/ 02 ноября 2018

Это может сработать для вас.

Во-первых, я думаю, что для столбцов EMPLOYEE.eperson_id и PARTICIPANT.pperson_id атрибут AUTO_INCREMENT не нужен.

Поскольку оба эти столбца имеют значение FOREIGN KEYS и ссылаются на столбец person_id таблицы PERSON, они должны в любом случае получать и будут получать свои значения из этого столбца через TRIGGER, поэтому нет необходимости автоинкрементировать их в таблицах. Так что я бы это изменил.

Этот TRIGGER должен работать с заполнением обеих таблиц EMPLOYEE и PARTICIPANT после INSERT для таблицы PERSON:

DELIMITER //
    CREATE TRIGGER subtype_creator
    AFTER INSERT ON PERSON 
    FOR EACH ROW 
BEGIN
    INSERT INTO EMPLOYEE(eperson_id, enterprise_email, manager_id)
    VALUES(NEW.person_id, NULL, NULL);
    INSERT INTO PARTICIPANT(pperson_id, city, state, zip, sign_up_date, termination_date)
    VALUES(NEW.person_id, NULL, NULL, NULL, NULL, NULL);
END//
DELIMITER ;

Надеюсь, это поможет вам.

...