Başlıkta tam ifade edemedim aslında. Bir veritabanında auto increment yani otomatik artan bir değer var. Örneğin ID. Insert sorgusu yazarken bu değeri belirltmediğim zaman otomatik olarak son verilen değerden bir fazlası olarak atanıyor. Bu şekilde auto increment özelliğini kullandığım veri tabanında insert sorgusundan sonra eklediğim kayıt için otomatik verilen ID değerini ek sorgu yazmadan alabilr miyim? Ek olarak farklı bir sorgu yazacaksam nasıl yazabilirim? Mesela diğer eklenen verilerle tekrar select sorgusu yazıp karşılaştırarak mı? Bu işlemi PHP ve MYSQL ile yapacağım o yüzden bu konularda cevaplar daha yararlı olacak. Şimdiden teşekkürler.

soruldu: 08 Kas '12, 02:16

numankaraaslan's gravatar image

numankaraaslan
1.8k253749
cevap kabul oranı: 19%


Mysql'de auto_increment id LAST_INSERT_ID() fonksiyonu ile alınabilir. Kullanımı şöyle:

INSERT INTO CUSTOMERS(ID, NAME, SURNAME) VALUES(NULL, 'AHMET', 'YILMAZ');

INSERT INTO ADDRESSES(ID, CUSTOMER_ID, CITY) VALUES (NULL, LAST_INSERT_ID(), 'İSTANBUL')

LAST_INSERT_ID() nin detayları burada bulunabilir

Güncelleme

Bu fonksiyon session bazlı çalışıyor. Yukaridaki örnek için düşünürsek, 1. tabloya kaydı ekledikten sonra, 2. tabloya kaydı eklemeden, başka bir session 1. tabloya farklı bir kayıt eklerse, bizim CUSTOMER_ID değerimiz bozulmuş olmaz. Dökümandan da şu şekilde anlatılmış:

The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.

permanent link

cevaplandı: 08 Kas '12, 03:53

Mesut's gravatar image

Mesut
60721017
cevap kabul oranı: 25%

değiştirildi: 08 Kas '12, 09:35

evet bu tam istediğim cevap. zaten mysql ve php için mysqli_insert_id() fonksiyonu varmış.

http://nl.php.net/manual/en/mysqli.insert-id.php

(08 Kas '12, 04:00) numankaraaslan numankaraaslan's gravatar image
1

Onda bir sıkıntı var. Database'in herhangi bir tablosuna eklenmiş olan son ID'yi getirir. Mesela siz siz customer'ı eklediğinizde insert etmeden önce, farklı tabloya insert olayı gerçekleşirse en son eklenen ID'yi size getirir. MySQL'in DB bazlı çalışıyor fakat tablo bazlı bu fonksiyonu çalışmaz. PostgreSQL'in tablo bazlı desteği var bildiğim kadarıyla.

(08 Kas '12, 06:12) Turgay Can Turgay%20Can's gravatar image

anladım. zaten en son işlem yapılan tablo için kullanıyorum bu özelliği. MYSQL en son hangi tabloya auto increment ile eklemişse PHP 'deki "mysqli_insert_id" ile çekilebiliyor yani sorun yok.

(08 Kas '12, 06:29) numankaraaslan numankaraaslan's gravatar image

Veriyi çekmek problem değil, yanlış bir yöntem söz konusu. Siz A tablosuna insert edip, B tablosundaki indexi alıp A tablosuna eklemeye çalışırsanız ki öyle bir ihtimal var ve A tablosunda o index dolu ise constraint hatasını verir. İşlem hali ilede yarıda kalmış olur. Oldukça kritik ve yanlış bir kullanım. Tabi sonuçta insiyatif ve karar yazılımcı ve yöneticisindedir. Açıkcaıs tavsiye etmem.

(08 Kas '12, 07:18) Turgay Can Turgay%20Can's gravatar image

@J2EE Tarif ettiğiniz case'i anlamadım. B tablosundaki index'i almak ne demek? A tablosundaki hangi constaint? Last_insert_id'nin dökümanı diyorki: LAST_INSERT_ID() (with no argument) returns a BIGINT (64-bit) value representing the first automatically generated value that was set for an AUTO_INCREMENT column by the most recently executed INSERT statement to affect such a column. Yani en son insert statement ile üretilen auto_increment değerini döndürür diyor. Bu değer session'a özel. Bunu bilerek kullandıktan sonra neden yanlış olsun.

(08 Kas '12, 07:41) Mesut Mesut's gravatar image

@J2EE ben anladım sanırım mantıksal olarak kullanımı doğru bulmuyorsunuz. Ben zaten örneğin A tablosune ekleme yapıyorsam oradan gelecek id değerini kodlarda hemen alt satırda kullanıyorum. Yani başka bir tabloya eklerken kullanmıyorum. Zaten açıklamalarda da yazıyor eklenen son sorgu yapılan tablo için değer döndürdüğünü yazıyor. yani dikkatli kullanılırsa sorun yok.

(08 Kas '12, 08:04) numankaraaslan numankaraaslan's gravatar image

Temel olarak bu fonksiyon MySQL'de en son insert edilmiş tablonun ID'sini size getirir fakat bu tablo bazlı değil, database bazlıdır, MySQL'de. Verdiğim örnek çok açık, siz "INSERT INTO CUSTOMERS(ID, NAME, SURNAME) VALUES(NULL, 'AHMET', 'YILMAZ');" işlemini yaptınız ve bu sırada tekrar "INSERT INTO CUSTOMERS(ID, NAME, SURNAME) VALUES(NULL, 'CAFER', 'GUREL');", bu işlem geldi. Siz "INSERT INTO ADDRESSES(ID, CUSTOMER_ID, CITY) VALUES (NULL, LAST_INSERT_ID(), 'İSTANBUL')" bu sorguyu çalıştırdığınızda CAFER'ın ID'sini AHMET'e eklemiş olursunuz.

Umarım anlatabilmişimdir:)

(08 Kas '12, 08:41) Turgay Can Turgay%20Can's gravatar image

Ben hatayı hala anlamadım :S Bu şekilde kodları yazan kişi zaten ikinci insert işleminden sonra oluşacak ID yi LAST_INNSERT_ID ile çekeceğini bilerek kullanır. Bu yazdığınız kodlarla anladığım kadarıyla "addresses" tablosuna AHMET in değil de CAFER in "ID" si ile ekleme yapmış oluyoruz. CAFER'ın ID'sini AHMET'e eklemiş olmaktan kastınızı anlayamadım. Server a birden fazla bilgisayardan istekler gelir ve bir bilgisayardan gelen istek ile başka bir bilgisayardan gelen istek karışır gibi bir durumdan mı bahsediyorsunuz?

(08 Kas '12, 08:56) numankaraaslan numankaraaslan's gravatar image

@J2EE Tamam şimdi bahsettiğiniz case'i anladim. Burada gözünüzden kaçırdığınız şey, bu fonksiyon sessionun bazlı çalışıyor olması. Yani başka bir session'dan yapılan insert işlemi benim LAST_INSERT_ID() değerini değiştirmiyor.

(08 Kas '12, 09:31) Mesut Mesut's gravatar image
9 yorumdan 5 tanesi gösteriliyor hepsini göster
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×168
×77

Soruldu: 08 Kas '12, 02:16

Görüntüleme: 2,692 kez

Son güncelleme: 08 Kas '12, 09:40

powered by BitNami OSQA