2016-06-15 6 views
0

У меня есть две таблицы базы данных в моей базе данных sql. Первый - это персональный стол, а другой - платежные реквизиты. В качестве внешнего ключа данных платежа используется идентификатор Auto inctiment в личной таблице. я должен вставлять данные в две эти таблицы за раз. Обычно я должен вставлять данные в персональную таблицу и получать идентификатор автоматической инкремента этой строки и вставлять данные в таблицу данных платежей. но у меня есть некоторые проблемы.mysql & php auto increment id и insert data

  • Я не могу получить автоматическое приращение идентификатора с помощью моего SQL SELECT запроса easily.because есть больше colums, чтобы проверить через WHERE.
  • Получить последний идентификатор вставки не является идеальным способом. потому что другой пользователь может вставить данные другого человека во время доступа, и я получаю неверный идентификатор.

У меня нет хороших знаний об этом. Помоги мне !

+2

Пожалуйста, добавьте то, что вы пробовали –

ответ

1

Я действительно не знаю вашу структуру, но лучше всего использовать транзакции. Ссылка: http://dev.mysql.com/doc/refman/5.7/en/commit.html.

START TRANSACTION; 
INSERT /* Your insertion into personalTable */ 
SELECT @lastId:=LAST_INSERT_ID(); 
INSERT INTO paymentTable SET (user_id) VALUES (@lastId); 
COMMIT; 

Кроме того, необходимо установить Уровень изоляции транзакций в SERIALIZABLE для предотвращения нарушений транзакций.

UPD. Спасибо @ Drew, чтобы заставить меня копать глубже.

+0

Нет, так как удаленная возможность проблемы, это не так. Между вашей вставкой и вашей переменной сохранить в строке 3, другой пользователь мог бы сделать вставку. Один использует 'LAST_INSERT_ID()' для безопасного получения этих данных. Эта функция возвращает последний идентификатор вставки для * вашего * клиентского соединения. – Drew

+0

Вы правы, но LAST_INSERT_ID() также не может предотвратить вставку, пока эта транзакция работает. Лучше всего установить уровень изоляции SERIALIZABLE, поэтому ваши транзакции будут полностью независимыми. https://dev.mysql.com/doc/refman/5.5/ru/set-transaction.html – jaro1989

+0

Почему мы хотим предотвратить вставку? Мы пытаемся получить правильный '@ lastId' во всех случаях, и ваш ответ неисправен. – Drew