MySQL: ВСТАВКА и ВЫБОР в одном запросе

#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. Правильно, таблица интересов — это заданное количество вариантов, которые может выбрать пользователь.