У меня есть 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 Как мне это исправить?