#mysql #select #insert
#mysql #выберите #вставить
Вопрос:
У меня есть сложный SQL
запрос для создания, который, если возможно, сэкономит мне много PHP-кода.
Итак, у меня есть HTML-форма, в которой посетитель может создать учетную запись пользователя с полями имя, адрес электронной почты, пароль, интересы.
Для имени, электронной почты и пароля у меня есть простой INSERT
запрос для ввода этой информации в базу users
данных, однако поле интересов может содержать несколько записей, поэтому эти данные хранятся в таблицах объединения «многие ко многим» ( interests
, user_interests
).
Для того, чтобы я ввел эти интересы в таблицу user_interests, мне нужно получить идентификационный номер пользователя, который был автоматически увеличен из начального INSERT
запроса плюс цикл над другой вставкой для каждого «интереса», выбранного пользователем. Могу ли я выполнить все это в одном SQL-запросе?
Комментарии:
1. Вам придется использовать 2 запроса или транзакцию.
LAST_INSERT_ID()
Будет полезно: dev.mysql.com/doc/refman/5.1/en /…2. Вероятно, да, используя INSERT INTO (cols . . .) ВЫБЕРИТЕ cols . . . ИЗ . . . , но вам нужно указать, какая информация находится в каких таблицах, когда вы хотите выполнить этот SQL.
Ответ №1:
Если вы хотите сделать это с помощью одной команды, то это звучит как хороший пример для изучения того, как писать хранимые процедуры MySQL. Результат тоже будет намного быстрее.
http://dev.mysql.com/doc/refman/5.0/en/stored-routines-last-insert-id.html
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-compound-statements.html
Комментарии:
1. И как вы собираетесь передавать список идентификаторов в хранимую процедуру? Возможно, я что-то упускаю, но я не могу найти какие-либо массивоподобные типы данных в руководстве MySQL.
2. Я бы передал его как список, разделенный запятыми, затем проанализировал данные и создал один оператор insert с несколькими строками. Определенно есть функции MySQL, которые легко это делают. Изучение написания SP — один из самых ценных навыков в программировании, потому что они универсальны для всех языков (вы просто вызываете их с параметрами)
3.дополнительные подсказки:dev.mysql.com/doc/refman/5.0/en/loop-statement.html forums.mysql.com/read.php?98 ,235478,235683#msg-235683
Ответ №2:
Ну, в MySQL оператор INSERT вставляет только в одну таблицу. Так что нет, это невозможно сделать с помощью одного запроса. Но вы можете сделать это с помощью двух запросов. MySQL поддерживает синтаксис, в котором вы можете вставлять несколько строк одним запросом:
insert into user_interests (user_id, interest_id) values (1,1), (1,2), (1,3)
PS Я правильно понимаю, что интересы являются классификатором, и добавление новых строк в interests
таблицу выходит за рамки этого вопроса, верно?
Комментарии:
1. У Oracle есть способ вставлять в несколько таблиц с помощью одной ВСТАВКИ: download.oracle.com/docs/cd/B19306_01/server.102/b14200 /…
2. Ах, ну тогда я беру свои слова обратно. : P
3. Правильно, таблица интересов — это заданное количество вариантов, которые может выбрать пользователь.