2016-03-29 15 views
1

Ich habe drei Databases, , tableB und tableAB. Der Inhalt ist nicht wirklich wichtig, nur dass und tableB Primärschlüssel haben und tableAB die Schlüssel in den beiden Tabellen bezieht. Die Grundstruktur ist unter:
Wählen Sie Von Einfügen In

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 

Was Ich mag würde zu tun ist, um die Einsätze von allen drei dieser Tabellen in einer Abfrage zu kombinieren, aber ich bin nicht sicher, wie. Die aktuelle Idee, mit der ich arbeite, ist unten, aber es funktioniert nicht. Wichtige Dinge zu beachten sind aId 's können sich auf mehrere bId' s beziehen, aber jede bId wird nur eine aId beziehen sich darauf. Daher darf sich aId nicht auf bestehende bId beziehen. Die großen Dinge, mit denen ich kämpfe sind 1) den Wert eines insert kommen von einem anderen insert, und 2) simulieren mehrere Einsätze, für bId 's, in einer einzigen Abfrage.

Aktuelle Abfrage:

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

Ich bin wirklich nicht sicher, mehrere Einsätze in einer einzigen Abfrage möglich ist, und weiß nicht, einen Weg, es oben zu schreiben.

+0

Multi-Tabellen-Einsätze in einer einzigen Abfrage werden von MySQL nicht unterstützt. :( – Sevle

+0

Sie könnten tun, was Sie in Postgres wollen, aber MySQL unterstützt nicht Inserts in mehrere Tabellen in einer einzigen Abfrage. –

+0

Es gibt eine LAST_INSERT_ID, siehe [Handbuch] (http://dev.mysql.com/doc/ refman/5.7/de/information-functions.html # function_last-insert-id), Beispiel: http://www.sqlfiddle.com/#!9/a8102/1/0 –

Antwort

1

Verwenden Sie LAST_INSERT_ID(), um die IDs der ersten zwei Inserts zu erhalten.

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); 

Sie könnten dies alles in eine gespeicherte Prozedur einfügen.

+0

Ich hatte 'LAST_INSERT_ID()' vergessen, danke für Ihre Antwort – yanman1234

1

Sie können das nicht in einer einzelnen Abfrage tun.

Aber Sie könnten ein TRANSACTION statt:

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() liefert die ID der zuvor eingefügte Zeile. Sie wird dann in einer Benutzervariablen mit SET gespeichert und kann in folgenden Anweisungen referenziert werden.

+0

Ist das nicht das gleiche wie @ Barmar's Antwort, außer mit Rollback-Kontrolle? scheint, speziell auf meine Frage, Ihre Antwort und seine sind funktionell die gleichen – yanman1234

+0

@ yanman1234 Er veröffentlichte nur ein paar Minuten nach mir, so könnte er zur gleichen Zeit daran gearbeitet haben. – Barmar

+0

Und mit einer Transaktion für verwandte Fragen wie Das ist eine gute Idee ein. – Barmar

Verwandte Themen