2017-09-26 45 views
0

如何使用一個查詢將值插入到兩個表中?我正在使用MySQL。我想要插入的其中一個表是多對多關係表。請參閱我下面的例子:如果一個表是結點表,如何用一個查詢插入到兩個表中?

enter image description here

我最近添加的許多一對多的關係表。當我插入新聞時,我輸入以下腳本:

INSERT INTO news (title, reporter_id) 
VALUES ('Some Title', 15); 

如何讓一個查詢能夠插入到兩個表中?每MySQL的插入documentation,好像我可以做查詢像

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 

的問題是,我不知道我的news_id,直到我執行我的第一次插入。我應該只有兩個插入語句還是有更好的方法?謝謝你的幫助!

+1

'START TRANSACTION;首先插入; INSERT INTO SECOND(LAST_INSERT_ID()); END TRANSACTION;' – Mihai

+2

該語法用於將多行插入到一個表中;不插入到多個表中。除了事務之外,我沒有意識到這樣做的語法,但這些並不是真正的單個查詢。 – Uueerdo

+0

可能重複[sql - 在一個查詢中插入多個表](https://stackoverflow.com/questions/3860280/sql-insert-into-multiple-tables-in-one-query) –

回答

0

正如Uueerdo在評論中提到的,您可以使用AFTER INSERT觸發器並使用NEW.id訪問生成的ID。

start transaction; 

insert into news(title, reporter_id) values 
    ('title2', 2), 
    ('title3', 3); 

insert into junctions(news_id, reporter_id) 
    select id, reporter_id 
    from news 
    where id >= last_insert_id() 
    order by id asc 
    limit 2; 

commit; 

這也適用於InnoDB如果innodb_autoinc_lock_mode設置爲0: - 但是,如果你想保持這種邏輯在應用程序層,你可以從第一個表批量插入後,將數據複製到第二或1,因爲生成的ID保證連續。

隨着innodb_autoinc_lock_mode設置爲0(「傳統」)或1(「連續」),通過任何給定語句生成的自動遞增的值是連續的,沒有間隙,這是因爲表級AUTO-INC鎖是一直持續到聲明結束,並且一次只能執行一個此類聲明。

AUTO_INCREMENT Handling in InnoDB

LAST_INSERT_ID()將返回第一插入行的生成的ID。

如果您將使用一個INSERT語句多行,LAST_INSERT_ID()返回該第一插排產生的價值。

Information Functions - LAST_INSERT_ID()

你知道第一個生成的ID。你知道插入行的數量。所以你知道要複製哪些行。

演示:http://rextester.com/UEN69961

相關問題