Как да получа Id на нововмъкнат запис в MySQL

Вътрешен човек

INSERT INTO pr_project_command (id_project, id_user, id_command_role) СТОЙНОСТИ (1, 1, 2)

В MsSQL бих могъл да получа нещо като @@ IDENTITY, което ще напише стойността на ID на полето за автоматично увеличаване, зададено при добавяне на записа.

Как да направите заявка за добавяне на нов запис в MySQL, върнете незабавно идентификатора?

rdm

Изберете mysql_insert_id () от таблицата

Вътрешен човек

Хм. Близо, но не разбирам съвсем - нали.
Възможна е ситуация (особено за системи за фактуриране), когато
между изпълнението на командата INSERT към table1 и SELECT LAST_INSERT_ID () FROM table1 за вмъкване на ID в Table2
системата може да вмъкне повече записи в table1, след това ще се върне грешното нещо ... = (

Вътрешен човек

В момента
Таблица1 съдържа

Id autoinc int (20) първичен
Име уникален varchar (120)

Така че проблемът се решава недвусмислено чрез изпълнение на заявка SELECT в полето Name (тъй като върху него е изграден уникален индекс) и след това чрез изпълнение на втория INSERT в свързаната таблица с получения ID. Това обаче е досадно. В MsSQL всичко е много по-просто ... Е, има StoredProcedures ...
Представете си колко SELECT-INSERT трябва да бъдат изпълнени, за да вмъкнете запис в поне 10 свързани таблици.

ise-dvp

функция ExecSQL ($ sql, $ newRow = 0) < // Только изменяющие запросы
// За INSERT в $ newRow връща auto_increment
// $ newRow се предава на функцията чрез препратка

глобална $ база данни, $ DBID;

if (! Empty ($ sql. $ Result = mysql_query ($ sql, $ DBID) или die (msgboxdberror ($ sql .;
$ newRow = mysql_insert_id ($ DBID);
връщане на mysql_affected_rows ($ DBID);
>
>

$ sql = 'вмъкване в стойностите на потребителите (вход, парола) ("newuser", md5 ("password & quot.';
$ ChangeRow = ExecSQL ($ sql, & $ newRow);

Вътрешен човек

mysql_insert_id () преобразува типа стойност, върнат от MySQL C API функцията mysql_insert_id (), в дълъг int (наречен int в PHP). Ако вашата колона AUTO_INCREMENT е BIGINT, стойността, върната от mysql_insert_id (), ще бъде изкривена. Вместо това използвайте функцията SQL LAST_INSERT_ID ().

Id autoinc int (20) първичен (int (20) == BIGINT)

// Все едно и също Все едно, дори и за 50 заявки в секунда, грешните идентификатори излитат, нововмъкнатите записи се изплъзват. (Засега лошо)
Засега само SELECT в UNIQUE поле работи сто процента

ise-dvp

Всъщност използвам предложената опция от около 5 години.

имаше ситуация, когато mysql_insert_id върна неправилни стойности, но това беше проблем от различен ред: възможно е идентификаторът на връзката ви с база данни да се предаде неправилно

в моя пример това е $ DBID ...

Вътрешен човек

Има един идентификатор за целия проект. Самите бази данни се различават:
1) Платежна база
2) Обработка на акаунти
3) Директно тематична база данни
В този случай се позовавам само на една база данни в скрипта и съответно указателят към базата данни не може да се промени.
(Опцията, разбира се, е приемлива, но не за системи с брой заявки> 100 в секунда, но TechRequirements не инсталирам)
Добре, ровя се в документацията за транзакциите, може, в рамките на една транзакция LAST_INSERT_ID () ще върне необходимото на 100%, а не на 95%.

Николас

ИЗБЕРЕТЕ * ОТ ____ КЪДЕ id = max ();

според мен беше така

ise-dvp

Ако SELECT * FROM ____ WHERE id = max ();
тогава заявката трябва да изглежда така:
ИЗБЕРЕТЕ макс. (Id) ОТ таблица с имена

но доколкото разбирам, заявките на Insider са много чести, повече от 100 в секунда, така че тази опция ще забави много системата

Те Антон

ИЗБЕРЕТЕ LAST_INSERT_ID ()
връща стойността на полето за автоматично увеличаване от последното вмъкване във вашата сесия на базата данни.

Тони25

Достатъчно е да изпълните вмъкване с един замах и в една и съща заявка след; ИЗБЕРЕТЕ LAST_INSERT_ID ();
ако изпълните SELECT LAST_INSERT_ID (); отделно от вложка? Ще върне 0

стопкран

Какъв клиент? В PHP един скрипт обикновено се изпълнява в рамките на една MySQL връзка, така че можете да получите недвусмислено стойността на вмъкнатия идентификатор, независимо от действията на други потребители:

$ sql = "ВЪВЕДЕТЕ В PR_project_command (id_project, id_user, id_command_role) СТОЙНОСТИ (1, 1, 2)";
mysql_query ($ sql);
$ sql = "ИЗБЕРЕТЕ LAST_INSERT_ID ()";
$ r = mysql_query ($ sql);
$ id = mysql_result ($ r, 0, 0);

MySQL също има съхранени процедури и тригери (от версия 5), можете да изчислите last_insert_id точно на сървъра, независимо от клиента.

Ігор_452

ВМЪКНЕТЕ В 'tp_data' ('id', 'cid', 'title', 'info', 'price', 'created', 'userid','pub_down ',' hits ')
СТОЙНОСТИ (
'', 6, 'Остатъчен остатък', 'О, cl', '7786', '2010-09-17 15:30:06', '1', '2010-09-30 15:30:15', ' '
); # Задни редове: 1
SET @lid = LAST_INSERT_ID (); # MySQL завъртя празен резултат (до нула редове).
INSERT INTO 'tp_advenced_data' ('id', 'dataid', 'valid')
СТОЙНОСТИ (
'', @lid, '3'
), (
'', @lid, '7'
), (
'', @lid, '9'
), (
'', @lid, '11'
), (
'', @lid, '13'
), (
'', @lid, '15'
); # Задни редове: 6

гост