【问题标题】: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 onethis one。但是,他们都没有接受答案,甚至没有接受答案。所以,请不要标记为重复。

【问题讨论】:

    标签: php mysql sql database junction-table


    【解决方案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 去旅行。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多