Eklenen bir satırın endeksi alınıyor

3 Cevap php

Ben güzel ve normalize üzerinde çalışıyorum bir proje için veritabanı tabloları tutmaya çalışıyorum, ama ben bir sorun haline çalıştırmak. Ben bir tabloya bir satır eklemek ve daha sonra başka bir tabloya ek veriler eklemek, böylece auto_incremented id sütun değeri ayarlanmış ne öğrenebilirim nasıl anlamaya çalışıyorum. Böyle mysql_insert_id "önceki INSERT işleminden oluşturulan kimliği almak" gibi işlevleri vardır biliyorum. Yanılmıyorsam Ancak, mysql_insert_id sadece son operasyonun kimliği döndürür. Başka bir sorgu satır eklenen ve kimliği için baktığınızda arasında çalıştırmak olabilirdi beri Yani, site yeterli trafik varsa bu mutlaka istediğiniz sorgunun kimliği dönmek olmaz. Bu anlayış mysql_insert_id doğru mudur? Bu yapmak konusunda herhangi bir öneri büyük takdir edilmektedir. Teşekkürler.

3 Cevap

LAST_INSERT_ID() oturum kapsamı vardır.

Bu geçerli oturumda eklenen kimlik değerini dönecektir.

Eğer INSERT ve LAST_INSERT_ID arasında herhangi bir satır eklemek istemiyorsanız, o zaman tamam çalışacaktır.

Birden çok değer uçlar için bu olsa, bu sonuncusu, eklenen ilk satırın kimliğini değil dönecektir Not:

INSERT
INTO    mytable (identity_column)
VALUES  (NULL)

SELECT  LAST_INSERT_ID()

--
1

INSERT
INTO    mytable (identity_column)
VALUES  (NULL), (NULL)

/* This inserts rows 2 and 3 */

SELECT  LAST_INSERT_ID()

--
2

/* But this returns 2, not 3 */

You could:

A. bir problem olabilir ve mysql_insert_id kullanmaz varsayalım

or

B. satırda bir zaman damgası dahil ve başka bir tabloya takmadan önce son eklenen kimliğini almak.

Bunun genel çözümü iki şeyden birini yapmak için:

  1. Ekleme yapar ve sonra (yani, kullanarak. LAST_INSERT_ID ()) son eklenen id alır ve sorgu çıktısı olarak döndüren bir usul sorgu oluşturun.

  2. , Ekleme yapmak id değeri gibi bir şey başka bir ekleme yapmak (tablosundan seçin myid nerede somecolumnval = 'val')

2b. Veya seçeneğini açık ve tek başına yapmak ve sonra bu değeri kullanarak diğer ekler yapmak.

Birinci dezavantajı bu olguların her biri için bir yordam yazmak zorunda olduğunu. Saniye dezavantajı bazı db motorları kabul etmiyoruz, ve kodunuzu Clutterlar, ve birden çok sütun üzerinde bir yerde yapmak zorunda yavaş olabilir olmasıdır.

Bu üzerinde hiçbir kontrole sahip aramalarınızın arasında uçlar olabileceğini varsayar. Eğer açık denetimi varsa, yukarıdaki diğer çözümlerden biri muhtemelen iyidir.