Как я могу получить идентификатор первичного ключа для файла, который я только что вставил? - PullRequest
2 голосов
/ 18 февраля 2010

Ранее сегодня я задал этот вопрос , который возник из-за моего плохого планирования и моего полного игнорирования практики нормализации баз данных. Последние 8 часов я читал о нормализации баз данных и тонкостях JOIN и пробирался по учебникам SQLZoo.com.

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

Вот мое старое видение: 1 таблица, называемая «файлами», в которой хранится, скажем, идентификатор файла и URL-адрес файла, и соответствующие уровни оценки для этого файла.

Новое видение !: 1 таблица для «файлов», 1 таблица для «оценок» и промежуточная таблица соединений.

Но это не моя проблема. Это действительно базовый вопрос, на который, я уверен, есть очевидный ответ: когда я создаю запись в «файлах», ей автоматически присваивается увеличенный первичный ключ (file_id). Однако теперь мне нужно записать этот file_id и в другие таблицы. Поскольку я не назначаю этот идентификатор вручную, как я узнаю, что это такое?

Если я загружаю text.doc и получаю file_id 123, откуда мне знать, что у него 123, чтобы записать его в «классы» и в таблицу соединений? Я не могу сделать max (file_id), потому что если у вас есть одновременные пользователи, вы можете получить другой идентификатор. Я просто не знаю, как получить значение file_id, не назначив его вручную.

Ответы [ 3 ]

3 голосов
/ 18 февраля 2010

Вы можете использовать LAST_INSERT_ID(), как в следующем примере:

START TRANSACTION;
INSERT INTO files (file_id, url) VALUES (NULL, 'text.doc');
INSERT INTO grades (file_id, grade) VALUES (LAST_INSERT_ID(), 'some-grade');
COMMIT;

Транзакция гарантирует, что операция остается атомарной: это гарантирует, что обе вставки завершатся успешно или не выполнятся вообще. Это необязательно, но рекомендуется для обеспечения целостности данных.

Для LAST_INSERT_ID(), наиболее недавно созданный идентификатор сохраняется в сервер для каждого соединения.

Это не изменено другим клиентом. Это даже не изменилось, если вы обновите другой столбец AUTO_INCREMENT с немагическое значение (то есть значение, которое не NULL и не 0).

Использование LAST_INSERT_ID() и AUTO_INCREMENT столбцы одновременно из нескольких клиенты совершенно действительны. каждый клиент получит последний вставленный Идентификатор для последнего утверждения этого клиента казнены.

Источник и дальнейшее чтение:

1 голос
/ 18 февраля 2010

Как вы собираетесь найти запись завтра, после того, как ваша программа забыла значение last_insert_id ()?

Использование суррогатного ключа - это нормально, но ваша таблица все еще представляет сущность, и вы должны быть в состоянии ответить на вопрос: какие измеримые свойства определяют эту конкретную сущность? Набор этих свойств является естественным ключом вашей таблицы, и даже если вы используете суррогатные ключи, такой естественный ключ всегда должен существовать, и вы должны использовать его для получения информации из таблицы. Используйте суррогатный ключ для обеспечения ссылочной целостности, для индексации пурпурных терминов и для облегчения соединений. Но не позволяйте им сбежать из базы данных

1 голос
/ 18 февраля 2010

В PHP, чтобы получить автоматически сгенерированный идентификатор записи MySQL, используйте свойство mysqli-> insert_id вашего объекта mysqli.

...