2014-12-01 2 views
0

Итак, у меня есть схема базы данных MySQL, в которой есть таблица USERS, которая содержит идентификатор в качестве первичного ключа для этой таблицы, у меня также есть таблица USER_PASSWORDS, ссылки таблица USERS, в которой USER_ID будет действовать как внешний ключ в этой таблице.MySQL Вставить пользователя и пароль одновременно, но в разных таблицах

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

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

Я не люблю этот подход, потому что это означает, что я должен:

вставки в базе данных запроса к базе данных INSERT в базу данных снова

Есть ли лучший способ сделать это?

Благодаря

ответ

1

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

Действительно единственный способ сделать то, что вы хотите, это решение, которое вы уже определили:

  1. Вставка в таблицу Users
  2. запрос, чтобы получить идентификатор пользователя вы только что вставили
  3. Вставьте в таблицу USER_PASSWORDS идентификатор, полученный для пользователя.

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

0

Одно решение: поскольку хэш уникален, вы можете использовать хеш в качестве первичного ключа в таблице USERS. Затем вы знаете, что первичный ключ (id) находится во время вставки и может повторно использоваться, когда INSERTING в таблице USER_PASSWORDS.

Таким образом, вы можете избежать запроса id по крайней мере.

0

Как вы действительно не сказать, для того, что система/язык программирования вам нужно это, и вы не представили ни одного примера кода либо, я могу только дать вам какую-то теорию, что вы могли бы сделать:

Его невозможно вставить данные в две разные таблицы MySQL с одним запросом, но вы можете уменьшить свой скрипт по крайней мере с помощью запроса SELECT:

1.) В большинстве случаев mysql apis (в зависимости от того, какой язык программирования и используемая вами MySQL) вы используете функцию, которая говорит: getLastInsertId() "," lastInsertId() "или аналогичный.

Это вернет идентификатор, который был вставлен путем автоинкремента таблицы после завершения вставки.

Просто проверьте документы вашего MySQL-api, у него будет такая функция.

2.) Вторая возможность - использование UUID - очень большой (обычно 128-битной) длинной строки, которая генерируется полностью случайным образом. Слишком много возможных комбинаций, скорее всего, произойдет, если вы выиграете в лотерее 10 раз подряд, тогда вы создадите два раза тот же UUID, который уже находится в вашей таблице.

Таким образом, вы просто генерируете UUID и вставляете его в качестве ключа в обе таблицы, и все готово.

Просто используйте google, чтобы узнать, что библиотеки, созданные для создания UUID, вам не нужно самостоятельно строить алографит.

UUID может выглядеть следующим образом: 4a34fe87-f577-4ea9-9557-1bc8f779a68c

+0

Эй, спасибо за информацию. Я буду писать это приложение на Java, и у меня есть опыт использования JDBC для подключения и запроса базы данных. Мне было интересно, сможет ли Hibernate помочь? – Hussain1993

+1

Добро пожаловать. Последний идентификатор вставки для Java JDBC: http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#getGeneratedKeys%28%29 ---> Однако мне интересно, почему в В мире вы разделяете хэши паролей из таблицы пользователей? Усушно каждый пользователь получил один пароль, поэтому у вас есть соотношение 1: 1, которое не требует дополнительной таблицы -> confused oO – Steini

+0

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

Смежные вопросы