在联结表中插入值

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_idplace_id 存储在Junction 或Association 表trips_places_asc 中? 我必须触发两个查询吗?请帮忙。

注意:关于 SO 有很多问题,例如 this one 和 this one。但是,他们都没有接受答案,甚至没有接受答案。所以,请不要标记为重复。

【问题讨论】:

【参考方案1】:

既然你有 place_nametrip_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 去旅行。

以上是关于在联结表中插入值的主要内容,如果未能解决你的问题,请参考以下文章

将所有记录插入到 Symfony 中的联结表中

如何管理联结表上的插入

管理联结表的最佳方法是啥? (删除并插入)

用于处理关系/联结表插入的 Web 服务器控件

在 if ... then 中使用插入语句 (SQL)

MySQL 使用一组值插入表中