如果一个表是联结表,如何使用一个查询插入两个表?

时间:2017-09-26 19:14:12

标签: mysql

如何只使用一个查询将值插入两个表?我正在使用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 个答案:

答案 0 :(得分: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_autoinc_lock_mode设置为01,则适用于InnoDB,因为生成的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