Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет
Только начала изучать 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)
Неактивен
пробел забыли
вместо
DELIMITER;
нужно
DELIMITER ;
Неактивен
vasya написал:
пробел забыли
вместо
DELIMITER;
нужно
DELIMITER ;
Спасибо тебе добрый человек, а то уже измучился весь. Часа 2 потратил на то чтобы найти причину и когда уже руки опустились решил спросить тут. Бред какой-то наделали, а ты потом мучийся пробелы ищи.
Сделал как ты написал но возникла другая ошибка:
Ввел:
INSERT INTO parent(id, name) values(1, 'Vasya');
Выдает ошибку:
Field 'id' doesn't have a default value
может подскажешь из-за чего и как поправить.
Неактивен
в таблице child поле id определено как not null, т.е должно быть какое-то значение
в триггере явно значение для этого поля не указывается
значение по умолчанию для этого поля не определено
поэтому и ругается
Неактивен
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)
Неактивен
Дмитрий22432 написал:
я и думал что если пишу
INSERT INTO parent(id, name) values(1, 'Vasya'); то явно указываю что хочу в поле id поместить цифру 1.
да всё верно
но когда вы добавляете строку в таблицу parent, триггер добавляет строку в таблицу child
и в той команде insert (которая внутри тригера) нет явного указания для поля id из таблицы child
варианты:
-) убрать not null
-) добавить default
-) определить id как auto_increment
Неактивен
Все понятно, спасибо огромное вам за разъяснение.
А подскажи еще пожалуйста, как можно сделать выбор с несколькими вариантами.
Допустим есть книги и нужно выбирать информацию или за определенный период или по выбранной книге. Такое реально сделать? Т.е. период может быть и не указан а конкретная книга указана или наоборот книга не указана а период указан.
Неактивен
можно, но это вопрос к приложению, которое формирует запрос на основе указанных пользователем данных
Неактивен
нужно использовать лишь скрипты sql без доп приложений
Неактивен
тогда не ясно откуда берутся данные - указана книга или период
опишите подробней задачу
Неактивен
если вам не сложно можете скинуть e-mail я вам туда напишу, чтобы тему не захламлять тем что не относится к данной теме.
или вот мой, отправьте мне просто любое письмо я вам отвечу. dmitrij_voronczov_1993@mail.ru
Неактивен
лучше на форуме - одна голова хорошо, а больше лучше
Неактивен
Имеется mysql база с книгами
Оттуда с помощью скриптов написанных на sql нужно вытянуть информацию:
Получать информацию о количестве прочитанных/непрочитанных книг за выбранный период или детальную информацию о выбранной книге.
интересует можно ли эти 2 условия реализовать в одном скрипте с возможностью выбора нужного, или просто написать 2 разных скрипта?
информацию о конкретной книге или периоде ввожу сам.
Отредактированно Дмитрий22432 (08.11.2018 13:06:20)
Неактивен
вероятно мы по разному понимаем "sql скрипт"
с моей т.з. это файл с набором sql команд вида create, select, insert и т.д
простейший пример - дамп базы данных
как туда вводить информацию о конкретной книге или периоде?
возможно вы имеете в виду хранимую процедуру?
приведите пример отдельного скрипта для одного из условий
Неактивен
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)
Неактивен
т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)
Неактивен
vasya написал:
т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)
спасибо почитаю, я тебе отправил письмо не знаю куда тут должно прийти отправил вот так
Неактивен
не приходило письмо, лучше тут отписывайте
Неактивен
Как сделать изменение значения в таблице? Например есть такой пример
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 раз.
Можно это еще как-то реализовать?
Неактивен
Дмитрий22432 написал:
Можно каким-либо образом сделать чтобы в таблице 'parent' значение 'activ' меняло свое значение?
при каких условиях и как должно меняться значение?
Неактивен
Вот пример с книгами:
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 значение менялось на 'не доступно'. Но нужно учесть что книгу могут заказать несколько человек.
Т.е. если бы заказывал только один человек то это легко можно было бы сделать через триггер, а вот как сделать если заказов на одну книгу может быть много я чего-то не придумаю.
Неактивен
в программе, которая добавляет запись в customer сразу же и обновлять activ
но можно и через триггер
в чем проблема, если он будет срабатывать несколько раз?
Неактивен
Я не знаю просто может это на что-то влияет
попробовал записать триггер вот таким образом не работает пишет что поле не найдено
DELIMITER $$
CREATE TRIGGER new_profile AFTER INSERT ON customer
for each row
begin
update book SET activ = TRUE WHERE id= book_id;
END $$
DELIMITER ;
надо как-то по другому это указывать?
Неактивен
WHERE id= NEW.book_id;
Неактивен
в книги добавил книжку с id = 1111;
при добавлении новой записи:
mysql> insert into customer values(1, 'Vasya', 1111);
->
просто переходит на следующую строку и ждет дальнейшего ввода
Неактивен