Потокобезопасный способ получить автоматически увеличенный первичный ключ, вставленный в другую таблицу (чтобы их можно было соединить позже) - PullRequest
0 голосов
/ 16 октября 2011

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

$result = mysql_query("SHOW TABLE STATUS LIKE 'table_name'");
$row = mysql_fetch_array($result);
$nextId = $row['Auto_increment'];
mysql_free_result($result);

$sql = mysql_query("INSERT the information you want in the main table")

Затем вы можете вставить $ nextid в качестве внешнего ключа во все связанные таблицы.

Другой метод использует последний идентификатор вставки:

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;

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 16 октября 2011

Используйте второе (или mysql_insert_id()), так как оно в любом случае безопасно для пользователя . Транзакция необходима только для согласованности, но не для LAST_INSERT_ID() Кроме того, вы должны использовать mysqli_*() вместо mysql_*(), поскольку это улучшенная библиотека доступа к базе данных.

0 голосов
/ 16 октября 2011

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

0 голосов
/ 16 октября 2011

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

Хотя это очень маловероятно.

...