Страница 1 из 1

Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 14:34:41
vadim64
Имеются таблицы authors и books
В таблице author хранятся записи с уникальными полями id и name. Поле id имеет статус AUTO_INCREMENT
В таблице books хранятся записи с уникальными полями id, title и author_id, где author_id - id автора из таблицы authors. Поле id имеет статус AUTO_INCREMENT
Имеется формы для добавления авторов, используется запрос а-ля

Код: Выделить всё

INSERT INTO authors (name) VALUES ('$name')
Имеется формы для добавления книг, используется запрос а-ля

Код: Выделить всё

INSERT INTO books (name) VALUES ('$title', '$author_id')
Планируется новая форма, позволяющая при добавлении автора сразу добавлять несколько его книг.
Как должен выглядеть запрос/транзакция, чтобы при вставке автора и книг, автоинкрементный id автора автоматически закидывался в записи с книгами?

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 15:24:05
Electronik
запрос 1 добавляем сначала автора что бы прописался id

Код: Выделить всё

INSERT INTO authors (name) VALUES ('$name') 
запрос 2 добавляем книгу и ищем автора

Код: Выделить всё

INSERT INTO books (name) VALUES ('$title', ("SELECT author_id FROM  authors WHERE '$name'"))

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 18:45:56
vadim64
спасибо!!!
возникли вопросы:
1. есть ли ещё альтернативы кроме транзакций?
2. вы второй раз уже меня выручаете. может литературу посоветуете?

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 19:18:49
Gamerman
В своем софте вообще без транзакций обхожусь. На мускуле.
Нужно определиться, нужны ли они, и что будет, если будет без транзакций и глюканет что-либо.

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 19:20:19
Electronik
1. Что вы имеете ввиду
2. Не знаю, не читал особо книг, могу посоветовать как можно больше практики.

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 19:37:28
хз
по последним данным разведки СиКуЭль гумно - http://www.opennet.ru/opennews/art.shtml?num=31061

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 20:03:47
vadim64
to gamerman: а как в данном случае обеспечить атомарность описанной в посте http://forum.lissyara.su/viewtopic.php? ... 46#p300406 операции, без использования транзакции??

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 20:10:02
Gamerman
vadim64 писал(а):to gamerman: а как в данном случае обеспечить атомарность описанной в посте http://forum.lissyara.su/viewtopic.php? ... 46#p300406 операции, без использования транзакции??
Нужно больше информации. Например, откуда будут браться книги введенного автора, и т.д.
Я не говорю, что транзакции не нужны (иначе б их не делали), а то, что без них часто можно обойтись, применяя другие методы.

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 20:17:35
vadim64
всё будет браться из формы, из масива ПОСТ, по хттп
я спросил про возможность обойтись без транзакций, потому что не знаю всех мулек мускуля
там каких нибудь двойных инсертов нету? одним оператором вставка разных динамических величин в разные таблицы и столбцы?

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-07-01 21:55:52
Gamerman
По очереди делайте инсерты.

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-08-31 10:10:43
vadim64
А как сказать MySQL, чтобы он всем полям и таблицам в некоторой базе назначил иной колейшен?
Можно не одни запросом, хоть как
Помогите!!!))))

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-03 18:20:37
vadim64
Другой вопрос:
есть таблица A(col1, col2, col3) и таблица B(col4, col5, col6)
каким запросом можно попросить MySQL по порядку скопировать значения из A.col2 и A.col3 в B.col5 и B.col6?
B.col4 будет заполняться автоинкрементом

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-03 18:45:32
vadim64
почитал доку)))
дошло)))

Код: Выделить всё

INSERT INTO B (col5, col6) SELECT (col2, col3) FROM A
если кому нада вместе с индексами, будет проще

Код: Выделить всё

INSERT INTO B SELECT * FROM A

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-03 19:43:17
vadim64
сам только что попался:
если писать как я указал

Код: Выделить всё

INSERT INTO B (col5, col6) SELECT (col2, col3) FROM A
mysql дайт отлуп с формултровкой
#1241 - Operand should contain 1 column(s)
проблема - скобки в операнде SELECTа
правильно писать:

Код: Выделить всё

INSERT INTO B (col5, col6) SELECT col2, col3 FROM A

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-03 19:46:02
vadim64
хз писал(а):по последним данным разведки СиКуЭль гумно - http://www.opennet.ru/opennews/art.shtml?num=31061
троли - такие троли
:smile:

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-09 20:21:51
vadim64
В таблице books хранятся идентификаторы книг, идентификаторы из названий, идентификаторы их авторов и идентификаторы числа их страниц

Код: Выделить всё

Поле            Тип
id              int
title_id        int
author_id       int
pages_num_id    int
Сами значения хранятся отдельно в таблицах titles, authors и pages_nums:

Код: Выделить всё

Таблица titles
Поле      Тип
id        int
value     varchar(200)

Код: Выделить всё

Таблица authors
Поле      Тип
id        int
value     varchar(200)

Код: Выделить всё

Таблица pages_nums
Поле      Тип
id        int
value     int
Но, к сожалению, параметры заполнены не для всех книг: у какой то неизвестный автор, а у другой не подсчитаны страницы.
Запрос типа

Код: Выделить всё

SELECT titles.value AS title, authors.value AS author, pages_nums.value AS pages_num 
FROM books, titles, authors, pagrs_nums
WHERE books.title_id = titles.id AND books.author_id = authors.id AND books.pages_num_id = pages_nums.id ORDER BY title
не вернёт книги, у которых есть неизвестные характеристики.
А можно как нибудь сделать так чтобы вернул? Какие операторы нужно использовать?

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-09 22:07:42
PYO
Какие операторы нужно использовать?
JOIN

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-09 22:34:15
vadim64
эээээ
а как это?

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-09 23:04:55
Electronik

Код: Выделить всё

SELECT b.id, t.value, a.value, p.value
FROM books b
LEFT JOIN titles t ON t.id = b.title_id
LEFT JOIN authors a ON a.id = b.author_id
LEFT JOIN pages_nums p ON p.id = b.pages_nums_id

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-09 23:33:53
PYO
ещё:

Код: Выделить всё

ORDER BY t.value
в конце.

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-10 22:50:35
vadim64
ок)))
спасиба)))

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-12 21:11:54
FiL
PYO писал(а):
Какие операторы нужно использовать?
JOIN
не join, a left join. Собственно в примере правильно, да. Просто чтоб ТС не путал разные джойны :)

Re: Очередная порция глупых вопросов SQL-style

Добавлено: 2011-09-12 21:37:59
vadim64
спасибо
почитаю про них - пойму разницу