Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пара вопросов по синтаксису / 16 сообщений из 16, страница 1 из 1
07.09.2014, 18:43:26
    #38739874
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
1. Хочу создать БД Library с таблицей
Book
и с полями
id int(10) auto_increment
authorId int(10)
bookName varchar(100)
numberOfBooks int(10) default 1
currentNumberOfBooks int(10) - тут вопрос, как сделать так, чтобы по дефолту значение было равно значению колонки numberOfBooks
primary key (id), foreign key (authorId) references Person(id)

2. Хочу создать несколько хранимых процедур. Начал с простого и уже что-то не так. Красным пометил, где MySQL WorkBench видит ошибку

use Library;

drop procedure if exists newPerson;

create procedure newPerson ( firstName varchar(20), lastName varchar(20), isAuthor boolean)
begin
insert into Person (firstName, lastName, isAuthor) values (firstName, lastName, isAuthor);
end
...
Рейтинг: 0 / 0
07.09.2014, 19:03:29
    #38739879
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
GeronemocurrentNumberOfBooks int(10) - тут вопрос, как сделать так, чтобы по дефолту значение было равно значению колонки numberOfBooks Никак. Либо дублируйте значение в инсерте, либо делайте копирование в триггере before insert.
...
Рейтинг: 0 / 0
07.09.2014, 19:05:05
    #38739880
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Geronemo2. Хочу создать несколько хранимых процедур. Начал с простого и уже что-то не так. Красным пометил, где MySQL WorkBench видит ошибку

use Library;

drop procedure if exists newPerson;

create procedure newPerson ( firstName varchar(20), lastName varchar(20), isAuthor boolean)
begin
insert into Person (firstName, lastName, isAuthor) values (firstName, lastName, isAuthor);
endНе стоит одинаково называть разные объекты БД, в частности isAuthor.
Даже в тех случаях, когда это синтаксически допустимо, это приведет к ненужным сложностям в сопровождении кода.
...
Рейтинг: 0 / 0
07.09.2014, 19:22:35
    #38739888
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
miksoftНе стоит одинаково называть разные объекты БД, в частности isAuthor.
Даже в тех случаях, когда это синтаксически допустимо, это приведет к ненужным сложностям в сопровождении кода.
ок, я переименовал, теперь вот так.

use Library;

drop procedure if exists newPerson;

create procedure newPerson ( fName varchar(20), lName varchar(20), isAu boolean)
begin
insert into Person (firstName, lastName, isAuthor) values (fName, lName, isAu);
end

Но все равно там где закрывающая скобка и знак ';' какая-то ошибка.
При этом вот такое работает
авторuse Library;
insert into Person (firstName, lastName, isAuthor) values ('Ernest', 'Hemingway', true);
...
Рейтинг: 0 / 0
07.09.2014, 19:34:52
    #38739891
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
про точку с запятой - забыли про DELIMITER
...
Рейтинг: 0 / 0
07.09.2014, 19:54:05
    #38739905
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
miksoftпро точку с запятой - забыли про DELIMITER

DELIMITER $$

use Library$$

drop procedure if exists newPerson$$

create procedure newPerson ( fName varchar(20), lName varchar(20), isAu boolean)
begin
insert into Person (firstName, lastName, isAuthor) values (fName, lName, isAu);
end

Методом тыка вот такое заработало, пытаюсь нагуглить смысл такой конструкции.
...
Рейтинг: 0 / 0
07.09.2014, 19:56:25
    #38739906
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
GeronemoМетодом тыка вот такое заработало, пытаюсь нагуглить смысл такой конструкции.В случае с MySQL не нужен ни метод тыка, ни, обычно, гугл.
У MySQL есть весьма приличная официальная документация .
...
Рейтинг: 0 / 0
07.09.2014, 22:41:13
    #38740016
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Есть вопрос - как в MySQL можно заниматься отладкой. Я привык, что в java или c прога не компилируется, когда где-то ошибка или можно пройтись дебаггером и найти runtime ошибку. А как быть в MySQL

Я вот пишу довольно сложную для меня процедуру и в ней где-то ошибка, если бы была возможность смотреть, что там происходит во время выполнения.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create database Library;
use Library;

create table Person (id int(10) auto_increment, firstName varchar(20),  lastName varchar(20),  isAuthor boolean default false, primary key (id));

create table Book (id int(10) auto_increment, authorId int(10), bookName varchar(100), numberOfBooks int(10) default 1, currentNumberOfBooks int(10) default 1, primary key (id), foreign key (authorId) references Person(id) );

create table TakenBooks (id int(10) auto_increment, bookId int(10), readerId int(10), timeBookGot date not null, timeBookReturned date, foreign key (bookId) references Book (id), foreign key (readerId) references Person (id), primary key (id));



Так выглядит БД. Я сделал 12 записей в Person и 14 в Book

Пытаюсь создать процедуру addBooks ( fNameAuthor varchar(20), lNameAuthor varchar(20), bName varchar(100), numOfBooks int(10))
которая бы создавала автора, если его нету, создавала запись в таблице Book если такой нет или увеличивала количество книг в полях numberOfBooks и currentNumberOfBooks, если запись о такой книге уже есть.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure newPerson (in fName varchar(20),  lName varchar(20),  isAu boolean, out id int(10))
begin
	insert into Person (firstName, lastName, isAuthor) values (fName, lName, isAu);
	Set id = LAST_INSERT_ID(); 
end$$

create procedure newBook (authorId int(10), bookName varchar(100), numberOfBooks int(10), currentNumberOfBooks int(10))
begin
	insert into Book ( authorId , bookName, numberOfBooks , currentNumberOfBooks ) values (authorId , bookName, numberOfBooks , currentNumberOfBooks);
end$$



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create procedure addBooks ( fNameAuthor varchar(20),  lNameAuthor varchar(20),  bName varchar(100), numOfBooks int(10))
begin
	Declare idOAuth int(10);

	if (select count(*) from Person where fNameAuthor = Person.firstName and lNameAuthor = Person.lastName) = 0
		then
			call newPerson( fNameAuthor ,  lNameAuthor , true, @idOAuth);
			call newBook (@idOAuth, bName, numOfBooks, numOfBooks);
	end if;

#	if (select id from Book where Book.bookName = bname and Book.authorId = (select id from Person where Person.firstName = fNameAuthor and Person.lastName = lNameAuthor)) > 0
#		then
#			Set idOfBook = Book.id;

#			Set idOfBook = (select id from Book where Book.bookName = bname and Book.authorId = (select id from Person where Person.firstName = fNameAuthor and Person.lastName = lNameAuthor));
#			Update Book set numberOfBooks = numberOfBooks + numOfBooks and currentNumberOfBooks = currentNumberOfBooks + numOfBooks 
#					where Book.id = idOfBook;
#	else 
#		insert into Book  (authorId, bookName, numberOfBooks, currentNumberOfBooks) values (fNameAuthor, lNameAuthor, numOfBooks, numOfBooks);
#	end if;

end$$
...
Рейтинг: 0 / 0
07.09.2014, 23:24:03
    #38740044
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Geronemo,

Встроенных средств отладки в MySQL нет.
Есть внешние - 14579840

P.S. Не вчитывался внимательно в закомментированные строчки, но похоже, что что они делаются одним INSERT ... ON DUPLICATE KEY UPDATE ...
...
Рейтинг: 0 / 0
08.09.2014, 12:01:13
    #38740356
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Зацените процедуру добавления книги/книг в библиотеку

2 вспомогательные процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DELIMITER $$

use Library$$

drop procedure if exists newPerson$$
drop procedure if exists newBook$$
drop procedure if exists addBooks$$

create procedure newPerson (in fName varchar(20),  lName varchar(20),  isAu boolean, out id int(10))
begin
	insert into Person (firstName, lastName, isAuthor) values (fName, lName, isAu);
	Set id = LAST_INSERT_ID(); 
end$$

create procedure newBook (authorId int(10), bookName varchar(100), numberOfBooks int(10), currentNumberOfBooks int(10))
begin
	insert into Book ( authorId , bookName, numberOfBooks , currentNumberOfBooks ) values (authorId , bookName, numberOfBooks , currentNumberOfBooks);
end$$




Собственно сама процедура. Я ее потестил все ветви if работают верно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
create procedure addBooks ( fNameAuthor varchar(20),  lNameAuthor varchar(20),  bName varchar(100), numOfBooks int(10))
begin
	Declare idOAuth int(10);
	Declare authExists boolean;
	Declare bookExists boolean;

	Set	authExists = (select count(*) from Person where fNameAuthor = firstName and lNameAuthor = lastName > 0);

	# если нету такого автора, то создать автора и создать книгу этого автора
	if (!authExists)
	then
		call newPerson( fNameAuthor ,  lNameAuthor , true, @idOAuth);
		call newBook (@idOAuth, bName, numOfBooks, numOfBooks);
	# автор существует, насчет книги пока неизвестно
	else 
		Set idOAuth = (select id from Person where firstName = fNameAuthor and lastName = lNameAuthor);
		Set bookExists = (select count(*) from Book where authorId = idOAuth and bookName = bName > 0);

		# если книги не существует, то создаем новую книгу	
		if (!bookExists)
		then 
			call newBook (idOAuth, bName, numOfBooks, numOfBooks);
		# существует автор, сущестивует книга. Надо увеличить запасы книги на величину numOfBooks
		else 
			update Book Set numberOfBooks = numberOfBooks + numOfBooks, currentNumberOfBooks = currentNumberOfBooks + numOfBooks where authorId = idOAuth and bookName = bname;

		end if;
	
	end if;

end$$
...
Рейтинг: 0 / 0
25.09.2014, 11:52:53
    #38757245
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
еще один вопросик.

создал базу посвященную библиотеке
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table Writer (id int(10) auto_increment,  firstName varchar(20),  lastName varchar(20), fullName varchar(60), info varchar (1000), primary key (id));

create table LiteraryWork (id int(10) auto_increment, literaryWorkName varchar(100), primary key (id));

create table WriterOfLiteraryWork(id int(10) auto_increment, authorId int(10), literaryWorkId int(10), primary key (id), foreign key (authorId) references Writer(id), 
	foreign key (literaryWorkId) references LiteraryWork(id));

create table Book (id int(10) auto_increment, bookName varchar(100), numberOfBooks int(10) default 1, currentNumberOfBooks int(10) default 1, primary key (id) );


create table BookInfo (id int(10) auto_increment, literaryWorkId int(10), bookId int(10), primary key (id),  foreign key (bookId) references Book(id), 
	foreign key (literaryWorkId) references LiteraryWork(id));



Напихал туда данных. Специально, чтобы протестировать разные скользкие моменты. Типа несколько авторов у одного произведения (Ильф и Петров, Золотой теленок) или несколько томов у произведения данного автора (Лев Толстой, Война и Мир том 1, том 2, том 3).

Написал запрос

Код: sql
1.
2.
3.
select Book.id, Writer.fullName, LiteraryWork.literaryWorkName from Book, bookinfo, LiteraryWork, WriterOfLiteraryWork, Writer 
where Book.id = bookinfo.bookId and bookinfo.literaryWorkId = Literarywork.id and Literarywork.id = 
	WriterOfLiteraryWork.literaryWorkId and WriterOfLiteraryWork.authorId = Writer.id;



и получил 2 записи о золотом Теленке (т. к. там 2 автора) и 3 записи о Войне и мире (т. к. там 3 тома).

если добавить в конце group by Literarywork.literaryWorkName (или id), то Война и мир становится 1 записью, как и хотелось бы, а запись об авторе номер 2 Золотого Теленка (Петрове) не отображается.

Мне бы как-то сгруппировать все произведения так, чтобы Война и мир была одной записью, а Золотой Теленок 2-мя, в каждой свой автор.
...
Рейтинг: 0 / 0
25.09.2014, 11:57:02
    #38757256
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Отмена.

Можете не читать и не вникать в большое сообщение выше. Я добавил Writer.id и все стало замечательно

group by Literarywork.literaryWorkName, Writer.id
...
Рейтинг: 0 / 0
25.09.2014, 11:58:48
    #38757260
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Надо было лишь заглянуть в учебник на несколько минут и узнать, что в group by можно перечислять критерии через запятые, а не только с помощью and
(жаль тут нельзя редактировать сообщения, я бы этот текст добавил к предыдущему)
...
Рейтинг: 0 / 0
25.09.2014, 13:18:16
    #38757408
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
Geronemoв group by можно перечислять критерии через запятые, а не только с помощью andа расскажите, как можно перечислять критерии в group by с помощью and?
...
Рейтинг: 0 / 0
25.09.2014, 13:38:07
    #38757449
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
tanglirGeronemoв group by можно перечислять критерии через запятые, а не только с помощью andа расскажите, как можно перечислять критерии в group by с помощью and?Синтаксически это не запрещено. Только тогда это будет всего один критерий с всего двумя значениями, т.е. будет максимум две группы.
...
Рейтинг: 0 / 0
25.09.2014, 14:24:24
    #38757553
Geronemo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пара вопросов по синтаксису
tanglirGeronemoв group by можно перечислять критерии через запятые, а не только с помощью andа расскажите, как можно перечислять критерии в group by с помощью and?

Спасибо. Своим комментарием вы ответили на мучавший меня вопрос, правильно ли я создал таблицы для данной предметной области ))
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пара вопросов по синтаксису / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]