Я пытался найти insert
информацию в нескольких таблицах в одном запросе, но обнаружил, что это невозможно? Так что я хочу insert
, просто используя несколько запросов, т.е.
INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')
Но как я могу дать автоинкремент id
от " users
до" userid
для profile
таблицы?
Ответы:
Нет, вы не можете вставить в несколько таблиц в одной команде MySQL. Однако вы можете использовать транзакции.
Обратите внимание на
LAST_INSERT_ID()
повторное использование значений автоинкремента.Редактировать: вы сказали: « После всего этого времени, пытаясь выяснить это, он все еще не работает. Разве я не могу просто поместить только что сгенерированный идентификатор в $ var и поместить этот $ var во все команды MySQL? »
Позвольте мне уточнить: есть 3 возможных пути здесь:
В коде вы видите выше. Это делает все это в MySQL, и
LAST_INSERT_ID()
во втором операторе автоматически будет значение столбца автоинкремента, который был вставлен в первый оператор.К сожалению, когда второй оператор сам вставит строки в таблицу со столбцом автоинкремента,
LAST_INSERT_ID()
он будет обновлен до таблицы 2, а не таблицы 1. Если вам все еще понадобится таблица 1, мы должны будем ее сохранить. в переменной. Это приводит нас к способам 2 и 3:Будет храниться
LAST_INSERT_ID()
в переменной MySQL:Запишем
LAST_INSERT_ID()
в переменную php (или любой язык, который может подключаться к базе данных, по вашему выбору):INSERT ...
LAST_INSERT_ID()
, либо выполнив этот буквальный оператор в MySQL, либо используя, например, php,mysql_insert_id()
который сделает это за васINSERT [use your php variable here]
ПРЕДУПРЕЖДЕНИЕ
Какой бы способ решения этой проблемы вы ни выбрали, вы должны решить, что должно произойти, если выполнение будет прервано между запросами (например, сбой вашего сервера базы данных). Если вы можете жить с «некоторые закончили, другие нет», не читайте дальше.
Однако, если вы решите «либо все запросы завершены, либо ни один не завершен - я не хочу, чтобы строки в некоторых таблицах, но не совпадали строки в других, я всегда хочу, чтобы таблицы моей базы данных были согласованными», вам нужно обернуть все операторы в транзакции. Вот почему я использовал
BEGIN
иCOMMIT
здесь.Прокомментируйте еще раз, если вам нужно больше информации :)
источник
@mysql_variables
вместе с подготовленными операторами?довольно просто, если вы используете хранимые процедуры:
полный скрипт:
источник
Что произойдет, если вы захотите создать много таких записей (зарегистрировать 10 пользователей, а не только одного)? Я нахожу следующее решение (всего 5 запросов):
Шаг I: Создать временную таблицу для хранения новых данных.
Затем заполните эту таблицу значениями.
Здесь вместо
$ALL_VAL
вас разместите список значений: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Шаг II: Отправьте данные в таблицу «user».
Здесь можно использовать «IGNORE», если вы разрешаете некоторым пользователям уже находиться внутри. При желании вы можете использовать ОБНОВЛЕНИЕ, аналогичное шагу III, перед этим шагом, чтобы найти, какие пользователи уже находятся внутри (и отметить их в таблице tmp). Здесь мы предполагаем, что имя пользователя объявлено как
PRIMARY
в таблице пользователей.Шаг III: применить обновление, чтобы прочитать все идентификаторы пользователей от пользователей в таблицу tmp. ЭТО СУЩЕСТВЕННЫЙ ШАГ.
Шаг IV: создайте другую таблицу, используя чтение идентификатора для пользователей
источник
попробуй это
Рекомендации
PHP
MYSQL
источник
взгляните на mysql_insert_id ()
вот документация: http://in.php.net/manual/en/function.mysql-insert-id.php
источник
LAST_INSERT_ID()
программиста?Это способ, которым я сделал это для универа, работает нормально, но не безопасно
}
источник
Просто замечание о вашей поговорке
Вы едите все свои обеденные блюда, смешанные с напитками в одной миске?
Я полагаю - нет.
Тоже самое.
Есть вещи, которые мы делаем отдельно.
2 запроса на вставку - это 2 запроса на вставку. Все хорошо. Ничего плохого в этом нет. Не нужно пюре в одном.
То же самое для выбора. Запрос должен быть разумным и делать свое дело. Это единственные причины. Количество запросов нет.
Что касается транзакций - вы можете их использовать, но это не так уж важно для обычного веб-сайта. Если случится один раз в год (если вообще когда-либо), что одна регистрация пользователя будет прервана, вы, несомненно, сможете это исправить.
Есть сотни тысяч сайтов, работающих под управлением MySQL без драйвера поддержки транзакций. Вы слышали о страшных бедствиях, разрушающих эти места? И я нет.
И mysql_insert_id () не имеет ничего общего с транзакциями. Вы можете включить в транзакцию все в порядке. это просто разные вопросы. Кто-то поднял этот вопрос из ниоткуда.
источник
That function is the devil of database consistency.
сделал ваш , а не транзакции. Я не вижу ничего плохого в сделках.Для PDO Вы можете сделать это
источник