在联结表中插入值
Posted
技术标签:
【中文标题】在联结表中插入值【英文标题】:Insert values in junction table 【发布时间】:2014-10-31 16:50:39 【问题描述】:我在数据库中有三个表:
trips(trip_id(pk), trip_name(unique), user_id(fk))
places(place_id(pk), place_name(unique))
trips_places_asc(trip_id(fk), place_id(fk))
因为,很多旅行可以有很多地方,所以我有一个如上所述的连接表。
现在,如果用户在行程中插入地点,这些地点将被添加到places
表中,并且行程将与trips_places_asc
表中的地点相关联。
所以,如果我写这样的查询:
INSERT INTO places (place_name)
VALUES ('XYZ')
INSERT INTO trips (trip_name)
VALUES ('MyTrip')
那么,如何将trip_id
和place_id
存储在Junction 或Association 表trips_places_asc
中?
我必须触发两个查询吗?请帮忙。
注意:关于 SO 有很多问题,例如 this one 和 this one。但是,他们都没有接受答案,甚至没有接受答案。所以,请不要标记为重复。
【问题讨论】:
【参考方案1】:既然你有 place_name
和 trip_name
是独一无二的,那么就这样做:
insert into trips_places_asc ( trip_id, place_id )
values ( (select trip_id from trips where trip_name = 'MyTrip'),
(select place_id from places where place_name = 'XYZ') );
或者根据您用于插入的命令(我的意思是 php 命令),您可以在插入后返回 id 并使用它来运行插入命令。
它会像:(使用 mysqli* 函数)
$query = "INSERT INTO trips (trip_name) values ('MyTrip')";
$mysqli->query($query);
$trip_id = $mysqli->insert_id;
$query2 = "INSERT INTO places (place_name) values ('XYZ')";
$mysqli->query($query2);
$place_id = $mysqli->insert_id;
$query3 = "insert into trips_places_asc ( trip_id, place_id ) ";
$query3 .= " values ($trip_id, $place_id)";
注意,我是直接从脑海中做的,所以也许你必须调整一些语法错误或担心准备好的语句。
编辑 虽然我应该添加有关此命令的正确文档链接:http://php.net/manual/en/mysqli.insert-id.php
【讨论】:
谢谢..但是如果我从 trip_name 中删除唯一键呢? 那么您将不得不使用第二个选项。我将使用 php 命令通过一个小示例来编辑答案。稍等。 先生,您在吗?我在等你的答复。 您好先生,两个案例都运行成功。但是,我有一个问题:假设,如果我在你的第一种情况下运行两次查询,那么我将在关联表中有多个相同外键的记录。遇到这种情况该怎么办? 然后,创建一个数组并存储您将多次运行查询的每个实体的 ID。确保按顺序添加它,因为命令$mysqli->insert_id
将只返回最后插入的 id。因此,您的模型中的逻辑方式是插入一次旅行和许多地方(在我看来),因此您存储 triid 并为地点创建一个数组,然后将每个地点 id 放在该数组上,然后对其进行迭代插入带着每个 id 去旅行。以上是关于在联结表中插入值的主要内容,如果未能解决你的问题,请参考以下文章