MySQL создание после вставки триггера не проходит ограничение внешнего ключа - PullRequest
0 голосов
/ 07 марта 2020

У меня есть 3 таблицы:

create table users (
    id int auto_increment primary key,
    first_name varchar(40) not null,
    last_name varchar(40) not null,
    email varchar(40) not null,
    password varchar(40) not null,
    deleted tinyint(1) not null default 0
) engine = InnoDB;

create table comments (
    id int auto_increment primary key,
    task_id int not null,
    foreign key fk_comment_task(task_id) references tasks(id),
    user int not null,
    foreign key fk_comment_user(user) references users(id),
    comment varchar(1000) not null,
    comment_date date not null,
    viewed tinyint(1) not null default 0,
    deleted tinyint(1) not null default 0   
) engine = InnoDB;

create table viewed_comments (
    id int auto_increment primary key,
    comment int not null,
    foreign key fk_viewed_comment(comment) references comments(id),
    viewer int not null,
    foreign key fk_viewed_viewer(viewer) references users(id),
    unread tinyint(1) not null default 0,
    deleted tinyint(1) not null default 0
 ) engine = InnoDB;

Я сделал триггер, который создает строки в visible_comments для каждого пользователя в таблице пользователей, который не является пользователем, отправившим комментарий:

delimiter |
create trigger ins_views after insert on comments 
for each row 
    begin
        DECLARE finished INT DEFAULT 0;
        DECLARE id INT DEFAULT 0;    
        DECLARE currentId CURSOR FOR SELECT id FROM users WHERE id != NEW.user; 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;     
        OPEN currentId; 
        update_views_loop: LOOP
            FETCH currentId INTO id;
            IF finished = 1 THEN LEAVE update_views_loop; END IF;

            INSERT INTO viewed_comments (comment, viewer) VALUES (NEW.id, id);

        END LOOP update_views_loop;
    CLOSE currentId; 
    END;
|

delimiter ;

Проблема в том, что когда я пытаюсь вставить комментарий, такой как

insert into comments (task_id, user, comment, comment_date) values (24, 6, 'test', '2018-3-5');

Не удается сказать «Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (viewed_comments, CONSTRAINT * 1011»). * ИНОСТРАННЫЙ КЛЮЧ (viewer) ССЫЛКИ users (id)). Когда я изменяю триггер в строке вставки следующим образом, он работает до некоторой степени:

INSERT INTO viewed_comments (comment, viewer) VALUES (NEW.id, 6);

В этом примере я имею 3 пользователей, а в таблице просматриваемых комментариев я получаю 3 новые строки вместо 2 Я не уверен, как решить эту проблему в MySQL или как напечатать переменные, чтобы увидеть значения, как это происходит. Похоже на строку курсора. Ключевое слово New игнорируется, в результате получается 3 строки вместо 2. Но тогда у него есть значение в операторе вставки, но у курсора нет значений. Я использую MariaDB 10.4.11 Как мне это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...