Jak zdobyć następny identyfikator w mysql, aby wstawić go do tabeli
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Jak zdobyć następny identyfikator w mysql, aby wstawić go do tabeli
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Odpowiedzi:
Użyj LAST_INSERT_ID()
z zapytania SQL.
Lub
Możesz również użyć, mysql_insert_id()
aby uzyskać go za pomocą PHP.
LAST_INSERT_ID()
.
mysqli_insert_id
Możesz użyć
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
lub jeśli nie chcesz używać schematu information_schema, możesz użyć tego
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
jest buforowany dev.mysql.com/doc/refman/8.0/en/… . Blog MySQL również zawiera kilka postów na ten temat, ale zmienna systemowa, o której wspominają, wydaje się przestarzała: mysqlserverteam.com/… mysqlserverteam.com/…
Możesz uzyskać następną wartość automatycznego zwiększania, wykonując:
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Należy pamiętać, że należy nie używać tego zmienić tabelę, należy użyć kolumny auto_increment to zrobić automatycznie zamiast.
Problem polega na tym, że last_insert_id()
jest to retrospektywne i dzięki temu można je zagwarantować w ramach bieżącego połączenia.
To dziecko jest perspektywiczne i dlatego nie jest wyjątkowe pod względem połączenia i nie można na nim polegać.
To działałoby tylko w przypadku jednej bazy danych połączeń, ale bazy danych z jednym połączeniem mają dziś zwyczaj stawania się jutro wieloma bazami danych połączeń.
Widzieć: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
? after insert
last_insert_id()
UPDATE
gdybym też. Ale wolałbym po prostu połączyć te dwie rzeczy w czasie wyświetlania i zaoszczędzić wszystkich kłopotów.
SHOW TABLE STATUS
spodziewa się zobaczyć database name
po FROM
i 'table name pattern'
po LIKE
.
To zwróci wartość automatycznego przyrostu dla bazy danych MySQL, a ja nie sprawdzałem tego z innymi bazami danych. Pamiętaj, że jeśli używasz innej bazy danych, składnia zapytania może być inna.
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();
Najlepsza odpowiedź wykorzystuje PHP MySQL_ jako rozwiązanie, pomyślałem, że udostępnię zaktualizowane rozwiązanie PHP MySQLi_ , aby to osiągnąć. W tym przykładzie nie ma wyjścia błędu!
$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();
echo $row['Auto_increment'];
Wyrzuca następny automatyczny przyrost w tabeli.
W PHP możesz spróbować tego:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
LUB
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Rozwiązanie:
CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
FOR EACH ROW
BEGIN
SELECT AUTO_INCREMENT Into @xId
FROM information_schema.tables
WHERE
Table_SCHEMA ="DataBaseName" AND
table_name = "payments";
SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);
END;
„DataBaseName” to nazwa naszej bazy danych
Możesz użyć wyzwalacza mysql
payment_code
w after insert
wyzwalaczu wydaje się najlepszą opcją.
Nie możesz używać identyfikatora podczas wstawiania, ani go nie potrzebujesz. MySQL nawet nie zna identyfikatora podczas wstawiania tego rekordu. Możesz po prostu zapisać "sahf4d2fdd45"
w payment_code
tabeli i użyć id
ipayment_code
później.
Jeśli naprawdę potrzebujesz, aby kod payment_code zawierał identyfikator, ZAKTUALIZUJ wiersz po wstawce, aby dodać identyfikator.
information_schema.tables
tabeli.
SELECT ... CONCAT(payment_code, id)
lub w kodzie aplikacji. Możesz nawet zawinąć SELECT
w a VIEW
, aby zawsze zwracać właściwą wartość, bez martwienia się o CONCAT w każdym SELECT z Twojej aplikacji.
Do czego potrzebny jest następny przyrostowy identyfikator?
MySQL dopuszcza tylko jedno pole autoinkrementacji na tabelę i musi być również kluczem podstawowym, aby zagwarantować unikalność.
Zwróć uwagę, że kiedy otrzymasz następny identyfikator insertu, może on nie być dostępny, gdy go używasz, ponieważ wartość, którą posiadasz, mieści się tylko w zakresie tej transakcji. Dlatego w zależności od obciążenia bazy danych ta wartość może być już wykorzystana w momencie nadejścia następnego żądania.
Sugerowałbym, abyś przejrzał swój projekt, aby upewnić się, że nie musisz wiedzieć, która wartość automatycznego przyrostu ma zostać przypisana jako następna
Proponuję przemyśleć to, co robisz. Nigdy nie doświadczyłem ani jednego przypadku użycia, w którym ta specjalna wiedza byłaby wymagana. Następny identyfikator to bardzo szczególny szczegół implementacji i nie liczyłbym na to, że jest bezpieczny dla ACID.
Wykonaj jedną prostą transakcję, która zaktualizuje wstawiony wiersz o ostatni identyfikator:
BEGIN;
INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');
UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();
COMMIT;
użyj „mysql_insert_id ()”. mysql_insert_id () działa na ostatnio wykonanym zapytaniu, pamiętaj, aby wywołać mysql_insert_id () natychmiast po zapytaniu, które generuje wartość.
Poniżej przykład zastosowania:
<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query("INSERT INTO mytable VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>
Mam nadzieję, że powyższy przykład się przyda.
mysql_insert_id();
Otóż to :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Chociaż wątpię w jego produktywność, ale jest w 100% niezawodny
używając odpowiedzi ravi404:
CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE Value BIGINT;
SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();
RETURN Value;
END
używając w zapytaniu wstawiającym, aby utworzyć skrót SHA1. dawny.:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Poprawa @ ravi404, w przypadku gdy przesunięcie autoincrement NIE JEST 1:
SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );
( auto_increment
-1): silnik db wydaje się zawsze uwzględniać przesunięcie o 1. Więc musisz porzucić to założenie, a następnie dodać opcjonalną wartość @@ auto_increment_offset lub domyślnie 1: IFNULL (@@ auto_increment_offset, 1)
U mnie działa i wygląda prosto:
$auto_inc_db = mysql_query("SELECT * FROM my_table_name ORDER BY id ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);
echo $next_id;//this is the new id, if auto increment is on
$last_id
powtarzalne przypisywanie, kiedy możesz po prostu DESC
. Twój while
blok wykonał mnóstwo bezużytecznej pracy.
auto_increment
kolumny