Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Создание триггера на изменение данных в таблице после INSERT в другой таблице  [new]
devil_cat2
Member

Откуда:
Сообщений: 2
Здравствуйте, только начал пытаться осваивать MySQL.
Вопрос по созданию триггера. У меня есть 2 таблицы: Students (Sno char(3), Sname char(8), Scount int) и Score(Sno char(3), Cno char(5), Degree decimal(4,1)). Нужно создать триггер, чтобы при добавлении информации об оценке студента через INSERT в таблицу Score, в таблице Student в соответствующей строке студента число Scount увеличивалось на 1.
Вроде бы понятно объяснил.
Никак не могу понять как правильно написать такой триггер, после инсерта с триггером число Scount увеличивается на неверное число.
Помогите, пожалуйста
Мой триггер
create trigger AddCount before insert on score 
for each row 
update student set Scount = Scount + 1 where Sno in (select Sno from score);


create table Student(
Sno char(3) not null primary key,
Sname char(8) not null,
Scount int null);
 
create table Score(
Sno Char(3) not null,
foreign key (Sno) references student(Sno) on update cascade,
Cno char(5) not null,
Degree decimal(4,1) null);
 
insert student(Sno, Sname, Scount)
values
('108', 'Tom', 40),
('105', 'John', 30),
('107', 'Mary', 23),
('101', 'Jake', 15),
('109', 'Lily', 10),
('103', 'James', 21);


И вот такой должен быть INSERT
insert score(Sno, Cno, Degree)
values
('103', '3-245', 86),
('105', '3-245', 75),
('109', '3-245', 68),
('103', '3-105', 92),
('105', '3-105', 88),
('109', '3-105', 76),
('101', '3-105', 64),
('107', '3-105', 91),
('107', '6-166', 79),
('108', '6-166', 81);


Сообщение было отредактировано: 19 ноя 20, 13:38
19 ноя 20, 13:40    [22235306]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на изменение данных в таблице после INSERT в другой таблице  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
CREATE TRIGGER AddCount 
AFTER INSERT 
ON score 
FOR EACH ROW 
UPDATE student 
SET Scount = Scount + 1 
WHERE Sno = NEW.Sno;

fiddle

Первая ошибка в том, что Вы делаете подзапрос в score, т.е. по всей таблице. А надо обращаться строго к значению текущей вставляемой записи, которая доступна через псевдотаблицу NEW.

Вторая ошибка - в использовании BEFORE-триггера. Если запрос на вставку не выполнится по какой-то причине, значение всё равно обновится. Надо обновлять только тогда, когда вставка уже успешно выполнена.
19 ноя 20, 14:25    [22235365]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера на изменение данных в таблице после INSERT в другой таблице  [new]
devil_cat2
Member

Откуда:
Сообщений: 2
Akina, большое спасибо вам за объяснение. Буду изучать дальше
19 ноя 20, 14:31    [22235373]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить