2016-03-29 17 views
1

İçerisinde üç adet datatable var, tableA, tableB ve tableAB. İçerik gerçekten önemli değil, sadece tableA ve tableB birincil anahtarlara sahiptir ve tableAB iki tablodaki tuşları ilişkilendirir. Temel yapısı aşağıdaki gibidir: Ne yapmak istiyorum ne
İçinden Ekle

aId|data 
---+---- 
1 |4 
2 |83 

bId|data 
---+---- 
1 |a 
2 |cd 
3 |bf 

abId|aId|bId 
----+---+--- 
1 |1 |1 
2 |1 |2 
3 |2 |3 

bir sorguya Bu tabloların üçünün ekler birleştirmek, ama nasıl emin değilim. Çalıştığım şu anki fikir aşağıda, fakat işe yaramıyor. Dikkat edilmesi gereken önemli noktalar aId 'un çok sayıda bId' a atıfta bulunabileceği, ancak her bir bId 'un sadece bir tane aId olduğu belirtilecektir. Bu nedenle, aId 'lar mevcut bId' lardan bahsedemeyebilir. Çarpıştığım büyük şeyler 1) insert değerini başka bir insert'dan geliyor, ve 2) tek bir sorguda, bId 'ler için çoklu ekleri simüle ediyor.

Güncel sorgusu:

insert into tableAB(aId, bId) 
values((select aId from(insert into tableA(data) values(5))), 
     (select bId from(insert into tableB(data) values("f")))); 

Gerçekten tek sorguda emin çoklu ekler değilim mümkündür ve yukarıdaki bunu yazarken bir yol bilmiyorum. İlk iki ekin kimliklerini almak için LAST_INSERT_ID() kullanın.

+0

Tek bir sorguda çok sayfalı ekler MySQL tarafından desteklenmez. :( – Sevle

+0

PostGres'te istediğinizi yapabilirsiniz, ancak MySQL tek bir sorguda birden çok tabloya eklemeleri desteklemez. –

+0

Bir LAST_INSERT_ID var, [kılavuz] 'a bakın (http://dev.mysql.com/doc/ refman/5.7/tr/information-functions.html # function_last-insert-id), örnek: http://www.sqlfiddle.com/#!9/a8102/1/0 –

cevap

1

INSERT INTO tableA (data) VALUES (5); 
SET @idA = LAST_INSERT_ID(); 
INSERT INTO tableB (data) VALUES ('f'); 
SET @idB = LAST_INSERT_ID(); 
INSERT INTO tablAB(aId, bId) VALUES (@idA, @idB); 

Tüm bunları saklı bir prosedüre koyabilirsiniz.

+0

LAST_INSERT_ID() 'hakkında unutmuştum, cevabınız için teşekkürler – yanman1234

1

Bunu tek bir sorguda yapamazsınız.

Ama eğer bir TRANSACTION yerine kullanabilirsiniz:

START TRANSACTION; 
    INSERT INTO tableA(data) VALUES(5); 
    SET @aid = LAST_INSERT_ID(); 
    INSERT INTO tableB(data) VALUES('f'); 
    SET @bid = LAST_INSERT_ID(); 
    INSERT INTO tableAB(aId, bId) VALUES(@aid,@bid); 
COMMIT; 

LAST_INSERT_ID() önceden eklenen satırın id döndürür. Daha sonra SET kullanılarak bir kullanıcı değişkeninde saklanır ve bu nedenle aşağıdaki ifadelerde referans alınabilir.

+0

Bu, rollback denetimi dışında, Barmar'ın yanıtıyla aynı değil midir? özellikle benim soruma göre, cevabınız ve onun işlevsel olarak aynı – yanman1234

+0

@ yanman1234 Sadece birkaç dakika sonra benden yayınladı, bu yüzden aynı anda üzerinde çalışıyor olabilirdi. – Barmar

+0

Ve benzeri ilgili sorgular için bir işlem kullanarak bu iyi bir ide a. – Barmar