MySQL'deki sonraki kimliği tabloya eklemek için nasıl alınır
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
MySQL'deki sonraki kimliği tabloya eklemek için nasıl alınır
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Yanıtlar:
Kullanım LAST_INSERT_ID()SQL sorgusu.
Veya
mysql_insert_id()PHP kullanarak almak için de kullanabilirsiniz .
LAST_INSERT_ID()
mysqli_insert_id
Kullanabilirsiniz
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
veya information_schema kullanmak istemiyorsanız bunu kullanabilirsiniz
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT önbelleğe alınan bu resmi belge durumu . Mysql blogunda da bununla ilgili birkaç gönderi var, ancak bahsettikleri sistem güncelliğini yitirmiş görünüyor: mysqlserverteam.com/… mysqlserverteam.com/…
Bir sonraki otomatik artış değerini şu şekilde elde edebilirsiniz :
SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Not gerektiğini değil tabloyu değiştirmek için kullanabilir, yerine otomatik bunu bir auto_increment sütununu kullanın.
Sorun, last_insert_id()geriye dönük olması ve dolayısıyla mevcut bağlantı içinde garanti edilebilmesidir.
Bu bebek potansiyeldir ve bu nedenle bağlantı başına benzersiz değildir ve güvenilemez.
Yalnızca tek bir bağlantı veritabanında çalışır, ancak bugün tek bağlantılı veritabanları yarın birden çok bağlantı veritabanı olma alışkanlığına sahiptir.
Görmek: SHOW TABLE STATUS
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'? after insertTetikleyicide güncellemeyi kullanırdım ve last_insert_id()yine de ...
UPDATE. Ancak ikisini görüntüleme zamanında birleştirmeyi ve tüm güçlüğü kurtarmayı tercih ederim.
SHOW TABLE STATUSdatabase namesonrasını FROMve 'table name pattern'sonrasını görmeyi bekler LIKE.
Bu, MySQL veritabanı için otomatik artış değerini döndürecektir ve diğer veritabanlarını kontrol etmedim. Lütfen başka bir veritabanı kullanıyorsanız, sorgu sözdiziminin farklı olabileceğini unutmayın.
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();
En üstteki cevap bir çözüm için PHP MySQL_ kullanıyor , bunu başarmak için güncellenmiş bir PHP MySQLi_ çözümünü paylaşacağımı düşündüm . Bu örnekte hata çıktısı yok!
$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'];
Tabloda gelen sonraki Otomatik artışı başlatır.
PHP'de şunu deneyebilirsiniz:
$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
VEYA
$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Çözüm:
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", Veri Tabanımızın adıdır
Mysql tetikleyicisini kullanabilirsiniz
payment_codeiçinde after inserttetikleyici en iyi seçenek gibi görünüyor.
Kimliği girerken kullanamazsınız, ihtiyacınız da yoktur. MySQL, bu kaydı eklediğinizde kimliği bile bilmiyor. Sadece kurtarabilecek "sahf4d2fdd45"içinde payment_codemasa ve kullanım idve payment_codedaha sonra.
Ödeme kodunuzun içinde kimliğe sahip olması için gerçekten ihtiyacınız varsa, kimliği eklemek için ekten sonraki satırı GÜNCELLEYİN.
information_schema.tablestabloda listeleniyor .
SELECT ... CONCAT(payment_code, id)da uygulama kodunuzda. Hatta , uygulamanızdaki her SELECT'te CONCAT hakkında endişelenmeden her zaman doğru değeri döndürmek için SELECTa içine bile sarabilirsiniz VIEW.
Bir sonraki artımlı kimliğe ne için ihtiyacınız var?
MySQL, tablo başına yalnızca bir otomatik artış alanına izin verir ve benzersizliği garantilemek için birincil anahtar olması da gerekir.
Bir sonraki giriş kimliğini aldığınızda, sahip olduğunuz değer yalnızca bu işlemin kapsamında olduğundan, onu kullandığınızda kullanılamayabileceğini unutmayın. Bu nedenle, veritabanınızdaki yüke bağlı olarak, bu değer bir sonraki istek geldiğinde zaten kullanılmış olabilir.
Daha sonra hangi otomatik artış değerini atayacağınızı bilmenize gerek olmadığından emin olmak için tasarımınızı gözden geçirmenizi öneririm.
Ne yaptığınızı yeniden düşünmenizi öneririm. Bu özel bilginin gerekli olduğu tek bir kullanım durumunu hiç yaşamadım. Bir sonraki kimlik çok özel bir uygulama detayıdır ve ACID güvenli olduğundan emin değilim.
Eklediğiniz satırı son id ile güncelleyen basit bir işlem yapın:
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;
"mysql_insert_id ()" kullanın. mysql_insert_id (), gerçekleştirilen son sorguya göre hareket eder, değeri üreten sorgudan hemen sonra mysql_insert_id () öğesini çağırdığınızdan emin olun.
Aşağıda kullanım örneği verilmiştir:
<?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());
?>
Umarım yukarıdaki örnek yararlıdır.
mysql_insert_id();
Bu kadar :)
SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Verimliliğinden şüphe duysam da% 100 güvenilir
ravi404 cevabını kullanarak:
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
SHA1 Hash oluşturmak için ekleme sorgunuzda kullanarak. ex .:
INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);
Otomatik artış ofsetinizin 1 DEĞİLDİR olması durumunda @ ravi404 iyileştirmesi:
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): db motoru her zaman 1 ofseti dikkate alıyor gibi görünüyor. Bu nedenle, bu varsayımı atmanız ve ardından @@ auto_increment_offset'in isteğe bağlı değerini eklemeniz veya 1: IFNULL (@@ auto_increment_offset, 1) değerine varsayılan değer eklemeniz gerekir.
Benim için işe yarıyor ve basit görünüyor:
$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_idzaman tekrar tekrar atama yapmak oldukça gereksizdir DESC. Kişisel whileblok yararsız çalışma yükleri yaptı.
auto_incrementsütun kullanın