SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.11.2018 11:02:26

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Не работает триггер

Всем привет

Только начала изучать sql и сразу же столкнулся с проблемами никак не работает триггер в mysql

Есть 2 таблицы:

create table parent (
    id int not null primary key,
    name char(80)
) engine=innodb;

create table child (
    id int not null,
    name char(80),
    parent_id int,
    foreign key(parent_id) references parent(id)
) engine=innodb;


пишу триггер следующего вида:
drop trigger if exists new_profile;
DELIMITER $$
CREATE TRIGGER new_profile AFTER INSERT ON parent
    for each row
    begin
    insert into child(parent_id) values(new.id);
END $$
DELIMITER;



и он такое ощущение что не закрывает триггер и выводит строчки чтобы дальше вводить информацию. По видео урокам смотрел там все отрабатывает без проблем сам пробую ни в какую не хочет работать. Что я делаю не так?

Видео с примером https://cloud.mail.ru/public/Bnmj/CavyhtfKW

Отредактированно Дмитрий22432 (07.11.2018 11:44:16)

Неактивен

 

#2 07.11.2018 15:28:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

пробел забыли
вместо
DELIMITER;
нужно
DELIMITER ;

Неактивен

 

#3 07.11.2018 16:59:12

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

vasya написал:

пробел забыли
вместо
DELIMITER;
нужно
DELIMITER ;

Спасибо тебе добрый человек, а то уже измучился весь. Часа 2 потратил на то чтобы найти причину и когда уже руки опустились решил спросить тут. Бред какой-то наделали, а ты потом мучийся пробелы ищи.

Сделал как ты написал но возникла другая ошибка:
Ввел:
INSERT INTO parent(id, name) values(1, 'Vasya');

Выдает ошибку:
Field 'id' doesn't have a default value

может подскажешь из-за чего и как поправить.

Неактивен

 

#4 07.11.2018 19:11:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

в таблице child поле id определено как not null, т.е должно быть какое-то значение
в триггере явно значение для этого поля не указывается
значение по умолчанию для этого поля не определено
поэтому и ругается

Неактивен

 

#5 07.11.2018 19:20:15

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

vasya написал:

в таблице child поле id определено как not null, т.е должно быть какое-то значение
в триггере явно значение для этого поля не указывается
значение по умолчанию для этого поля не определено
поэтому и ругается

Значит я чего то не так понял, когда смотрел видео уроки. Там говорили

1. Если я пишу вот так:
INSERT INTO parent values(1, 'Vasya');
То нужно указывать значения для всех полей.

2. Если я пишу вот так:
INSERT INTO parent(name) values('Vasya');
то можно присваивать значения определенным ячейкам в данном случае в ячейке name будет 'Vasya' а остальные ячейки будут пустые.(ну если конечно же не стоит флага not null).

я и думал что если пишу
INSERT INTO parent(id, name) values(1, 'Vasya');   то явно указываю что хочу в поле id поместить цифру 1.

Каким образом явно указать значение, подскажи пожалуйста. А то с этими уроками больше мучений чем учебы.

Отредактированно Дмитрий22432 (07.11.2018 19:32:22)

Неактивен

 

#6 07.11.2018 19:44:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

Дмитрий22432 написал:

я и думал что если пишу
INSERT INTO parent(id, name) values(1, 'Vasya');   то явно указываю что хочу в поле id поместить цифру 1.

да всё верно
но когда вы добавляете строку в таблицу parent, триггер добавляет строку в таблицу child
и в той команде insert (которая внутри тригера) нет явного указания для поля id из таблицы child

варианты:
-) убрать not null
-) добавить default
-) определить id как auto_increment

Неактивен

 

#7 08.11.2018 10:28:44

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

Все понятно, спасибо огромное вам за разъяснение.


А подскажи еще пожалуйста, как можно сделать выбор с несколькими вариантами.

Допустим есть книги и нужно выбирать информацию или за определенный период или по выбранной книге. Такое реально сделать? Т.е. период может быть и не указан а конкретная книга указана или наоборот книга не указана а период указан.

Неактивен

 

#8 08.11.2018 11:48:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

можно, но это вопрос к приложению, которое формирует запрос на основе указанных пользователем данных

Неактивен

 

#9 08.11.2018 12:23:46

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

нужно использовать лишь скрипты sql без доп приложений

Неактивен

 

#10 08.11.2018 12:31:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

тогда не ясно откуда берутся данные - указана книга или период
опишите подробней задачу

Неактивен

 

#11 08.11.2018 12:37:18

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

если вам не сложно можете скинуть e-mail я вам туда напишу, чтобы тему не захламлять тем что не относится к данной теме.

или вот мой, отправьте мне просто любое письмо я вам отвечу.     dmitrij_voronczov_1993@mail.ru

Неактивен

 

#12 08.11.2018 12:48:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

лучше на форуме - одна голова хорошо, а больше лучше

Неактивен

 

#13 08.11.2018 13:04:25

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

Имеется mysql база с книгами

Оттуда с помощью скриптов написанных на sql нужно вытянуть информацию:
Получать информацию о количестве прочитанных/непрочитанных книг за выбранный период или детальную информацию о выбранной книге.

интересует можно ли эти 2 условия реализовать в одном скрипте с возможностью выбора нужного, или просто написать 2 разных скрипта?

информацию о конкретной книге или периоде ввожу сам.

Отредактированно Дмитрий22432 (08.11.2018 13:06:20)

Неактивен

 

#14 08.11.2018 13:18:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

вероятно мы по разному понимаем "sql скрипт"
с моей т.з. это файл с набором sql команд вида create, select, insert и т.д
простейший пример - дамп базы данных

как туда вводить информацию о конкретной книге или периоде?
возможно вы имеете в виду хранимую процедуру?
приведите пример отдельного скрипта для одного из условий

Неактивен

 

#15 08.11.2018 13:45:36

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

create table books(
id int not null auto_increase,
name char(80),
activ boolean default false
price int not null,
kolctr int not null
);

Тут вводятся книги:
insert into books(name, price, kolctr) values('Название книги', 1200, 135);

Тут вводятся книги допустим популярные:
insert into books(name, price, kolctr, activ) values('Название книги', 1200, 135, true);

Затем делаю запрос:
select * from books where activ = true; - выводятся обычные книги
select * from books where activ = false; - выводтся популярные книги

Или если о конкретной книге:
select * from books where name = 'Название книги';

что-то вроде этого

Отредактированно Дмитрий22432 (08.11.2018 13:46:47)

Неактивен

 

#16 08.11.2018 14:05:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)

Неактивен

 

#17 08.11.2018 14:44:51

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

vasya написал:

т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)

спасибо почитаю, я тебе отправил письмо не знаю куда тут должно прийти отправил вот так

https://cloud.mail.ru/public/BhSk/NRV8GApuh

Неактивен

 

#18 08.11.2018 21:28:16

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

не приходило письмо, лучше тут отписывайте

Неактивен

 

#19 09.11.2018 12:42:18

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

Как сделать изменение значения в таблице? Например есть такой пример

create table parent (
    id int not null primary key,
    name char(80),
   activ boolean default false
);

create table child (
    id int not null,
    name char(80),
    parent_id int,
    foreign key(parent_id) references parent(id)
);


Можно каким-либо образом сделать чтобы в таблице  'parent' значение 'activ' меняло свое значение? Я сначала думал это сделать через триггер.  Но подумал что если делать через него ведь он будет срабатывать каждый раз когда я допустим добавляю запись в child, а если у одного 'parent' 4-5 записей значит он сработает 4-5 раз.

Можно это еще как-то реализовать?

Неактивен

 

#20 09.11.2018 12:46:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

Дмитрий22432 написал:

Можно каким-либо образом сделать чтобы в таблице  'parent' значение 'activ' меняло свое значение?

при каких условиях и как должно меняться значение?

Неактивен

 

#21 09.11.2018 13:00:04

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

Вот пример с книгами:

create table book (
    id int not null primary key,
    name char(80),
   activ boolean default false
);

create table customer (
    id int not null,
    name char(80),
    book_id int,
    foreign key(book_id) references book(id)
);


По умолчанию у книге статус 'доступна' и нужно чтобы при заказе книге т.е при добавлении записи в таблицу customer значение менялось на 'не доступно'.  Но нужно учесть что книгу могут заказать несколько человек.

Т.е. если бы заказывал только один человек то это легко можно было бы сделать через триггер, а вот как сделать если заказов на одну книгу может быть много я чего-то не придумаю.

Неактивен

 

#22 09.11.2018 13:14:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

в программе, которая добавляет запись в customer сразу же и обновлять activ

но можно и через триггер
в чем проблема, если он будет срабатывать несколько раз?

Неактивен

 

#23 09.11.2018 13:26:01

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

Я не знаю просто может это на что-то влияет

попробовал записать триггер вот таким образом не работает пишет что поле не найдено

DELIMITER $$
CREATE TRIGGER new_profile AFTER INSERT ON customer
    for each row
    begin

update book SET activ = TRUE WHERE id= book_id;
END $$
DELIMITER ;

надо как-то по другому это указывать?

Неактивен

 

#24 09.11.2018 13:31:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает триггер

WHERE id= NEW.book_id;

Неактивен

 

#25 09.11.2018 13:40:33

Дмитрий22432
Участник
Зарегистрирован: 07.11.2018
Сообщений: 24

Re: Не работает триггер

в книги добавил книжку с id = 1111;

при добавлении новой записи:
mysql> insert into customer values(1, 'Vasya', 1111);
       ->

просто переходит на следующую строку и ждет дальнейшего ввода

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson