2014-12-15 20 views
8

Her bir tablo değeri için yeni kimlik oluşturmak ve döndürmek için MySQL StoredProcedure yazdım, ancak MySQL WorkBench ve Java uygulamasından last_insert_id() öğesinde yanlış değer alıyor.MYSQL LAST_INSERT_ID amaçlandığı gibi çalışmıyor. Nasıl düzeltebilirim?

Bu yordam, birden çok oturumdan çağrılacak.

CALL `GET_NEW_ID`('test', @test); 
select @test; 

O "141215000000" bana verir ve bu() last_insert_id demektir 0 her zaman döndürür. Gördüğüm gibi doğru şekilde yeni verileri seq_data'ya ekledim.

Tablo böyle görünüyor.

CREATE TABLE `seq_data` (
    `id` int(6) NOT NULL AUTO_INCREMENT, 
    `name` varchar(20) COLLATE utf8_bin NOT NULL, 
    `stat_date` varchar(8) COLLATE utf8_bin NOT NULL, 
    PRIMARY KEY (`id`,`name`,`stat_date`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

Amacım gibidir ...

CALL `GET_NEW_ID`('test', @test); 
select @test; 

dönüş 141215000001

CALL `GET_NEW_ID`('test', @test); 
select @test; 

dönüş 141215000002

CALL `GET_NEW_ID`('hello', @test); 
select @test; 

dönüş 141215000001

cevap

4

'da belirtildiği gibi LAST_INSERT_ID(), gibi bir AUTO_INCREMENT sütunu için ayarlanan ilk otomatik olarak üretilen değeri temsil eden BIGINT (64-bit) değerini döndürür. Bu, bir sütun etkileyecek en son yürütülen INSERT ifadesidir. cevap için

CREATE PROCEDURE `GET_NEW_ID`(IN V_TABLE VARCHAR(10), OUT V_ID VARCHAR(12)) 
BEGIN 

    INSERT INTO seq_data (`name`, `stat_date`) 
    SELECT V_TABLE, DATE_FORMAT(NOW(),'%Y%m%d') FROM seq_data WHERE name = V_TABLE AND stat_date = DATE_FORMAT(NOW(),'%Y%m%d'); 
    SET V_ID = concat(DATE_FORMAT(NOW(),'%y%m%d'),LPAD(LAST_INSERT_ID(), 6, '0')); 

END 
+0

Teşekkür @Dondon: Senin durumunda

, sen id ekleme, bu nedenle AUTO_INCREMENT değeri dolayısıyla LAST_INSERT_ID döner 0.

Sen gibi bir şey deneyebilirsiniz oluşturulmaz. Ama ben zaten bunu denedim ve id ekleyerek neden farklı bir sütun 'isim' için yeni bir kimlik almaktır. Örneğin, tablo için yeni bir kimlik almak istiyorsam, test tablosu adı için başka bir kimlik 1 olduğundan, kimliği 1'den başlamaz. – handicop

+0

Tekrar, Teşekkür ederim @Dodon, neden istediğim gibi çalışmadığını açıklıyor, sorunu çözmek için bir geçici çözüm bulmam gerekiyor. – handicop

+2

@handicop Yanlış yapıyorsunuz. Kendinize yeni bir ID oluşturma ve * sonra * manuel olarak eklemek doğru cevap değildir. Bir başlangıç ​​için işlem gereksinimlerine bakar. Hatta * bir 'GET_NEW_ID()' prosedürüne sahip olmamalısınız. Otomatik olarak "INSERT" in bir yan etkisi olan "AUTO_INCREMENT" anahtarıyla bir tabloda gerçekleşmelidir. – EJP

İlgili konular