'daki bir TRIGGER içinden LAST_INSERT_ID() öğesini değiştirme Bir sütunun (id_2
) AUTO_INCREMENT
değerini hesaplamak için kullanılan bir BEFORE INSERT TRIGGER
var.MyTQL
id_1 | id_2 | data
1 | 1 | 'a'
1 | 2 | 'b'
1 | 3 | 'c'
2 | 1 | 'a'
2 | 2 | 'b'
2 | 3 | 'c'
2 | 4 | 'a'
3 | 1 | 'b'
3 | 2 | 'c'
PRIMARY (id_1, id_2) sahibim ve InnoDB kullanıyorum. Daha önce, tablo MyISAM kullanıyordu ve hiçbir sorunum olmadı: id_2
AUTO_INCREMENT
olarak ayarlandı, bu nedenle id_1
için her yeni girdi, yeni id_2
kendi başına üretecektir. Şimdi, InnoDB geçtikten sonra, ben de aynı şeyi yapmak için bu tetikleyici vardır: hariç
SET @id = NULL;
SELECT COALESCE(MAX(id_2) + 1, 1) INTO @id FROM tbl WHERE id_1 = NEW.id_1;
SET NEW.id_2= @id;
Bu mükemmel çalışıyor şimdi LAST_INSERT_ID()
yanlış değerini (0 döndürür) sahiptir. Çok fazla kod, LAST_INSERT_ID()
'un doğruluğuna bağlıdır. Ancak, MySQL 5.0.12'den beri TRIGGERS içinde LAST_INSERT_ID
'a yapılan tüm değişiklikler global değeri etkilememektedir. Bunu atlamanın bir yolu var mı? Ben kolayca LAST_INSERT_ID(NEW.id_2)
arayarak LAST_INSERT_ID
değiştirir AFTER UPDATE TRIGGER
ayarlayabilirsiniz, ancak herhangi bir istemci tarafı içine değiştirildi LAST_INSERT_ID
durumunu korumak için MySQL zorlamak için herhangi bir işçi etrafında çalışma var mı 0.
için LAST_INSERT_ID
set alacağı Tetik? Herhangi bir alternatif var mı, bu kutuyu destekleyen veya başka bir SELECT max(id_2) FROM tbl WHERE id_1 = :id
çalıştıran MyISAM'a geri dönmek, daha önce eklenen satırın bulunacağından emin olmak için işlemin bir parçası olarak mı?
> SHOW CREATE TABLE tbl;
CREATE TABLE `tbl` (
`id_1` int(11) NOT NULL,
`id_2` int(11) NOT NULL,
`data` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_1`,`id_2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Örnek: İlk deyim tabloya satır 1 | 4 | 'd'
ekleyecektir
INSERT INTO tbl (id_1, id_2, data) VALUES (1, NULL, 'd');
SELECT LAST_INSERT_ID();
. İkinci deyim 0
döndürecek, ancak 4
dönmek için gerekiyor. ürün içeriyor ben sepetleri içeren bir tablo var ve başka bir tablo (tbl
) sahip
:
sistemi hakkında kısa bir açıklama ekleyerek, Ravinder Reddy tarafından sorulan gibi. sepgesi sepgesi, uygulama tarafından oluşturulur ve sepetler tablosunda AUTO_INCREMENT
numarasına bir kimlik atar. Görev, numaralı öğelerini sepetinize = id_1
numaralı sepete tbl
ekleyerek bu sepetin kapsamına benzersiz bir kimlik atamaktır. Her ürün ürünle ilişkili data
ürününün, aynı sepeti numaralı ürünün içinde tekrarlanmasına gerek yoktur. Pratikte, tüm data
girişlerini tek bir sepeti içinde depolamaya çalışıyorum ve daha sonra bu tek girişleri id_1
- id_2
çiftlerine başvurabilir (ve alabilir).
Biraz kafam karışık, ama INSERT uygulanmış bir LAST_INSERT_ID() _before_ nasıl olurdu? LAST_INSERT_ID() öğesinin yalnızca bir istemci aynı istemci bağlantısı üzerinde yürütüldüğünde güvenilir olduğuna inanıyorum. Uygulama bir bağlantıyı açarsa, bir ekleme gerçekleştirir ve bağlantıyı kapatırsa, yeni bir bağlantı açamayacağınız ve bu bağlantıyı gerçekten çağırmadan önce bu bağlantıya bir ekleme yapmadan LAST_INSERT_ID() öğesine erişemeyeceğiniz anlamına gelir. –
INSERT tamamlandıktan sonra, Tetikleyiciyi çalıştırdıktan sonra LAST_INSERT_ID() işlevini çağırıyordum. Diğer bir deyişle, iki sütunlu birincil anahtarın ikinci sütununun değerini üretmek için tetikleyici, yeni ayarlanan değeri iletmenin bir yolu yoktu. Bu soruya bir örnek ekledim. – Xeos
@Xeos: Yayına "show create table tbl" gösterisini ekleyebilir misiniz? –