MySQL-如何使用外键插入多个表

MySQL-如何使用外键插入多个表,mysql,Mysql,我是MySQL新手,所以请友好一点:) 我想将php表单中的数据插入3个不同的表中,这些表都有外键。如何编写一个insert命令同时更新所有3个表,因为如果我尝试手动更新一个表,则会由于缺少引用而出错。 我是否必须处理“NULL”条目并一个接一个地更新每个表,还是可以用一个命令来解决这个问题?像MySQLi_多_查询 多谢各位 您很可能必须按依赖性的顺序插入内容。因此,如果有三个表(A、B和C),我们将假设C依赖于B,B依赖于A。我们还将假设每个表分别有主键AID、BID和CID 您可以将您的行

我是MySQL新手,所以请友好一点:)

我想将php表单中的数据插入3个不同的表中,这些表都有外键。如何编写一个insert命令同时更新所有3个表,因为如果我尝试手动更新一个表,则会由于缺少引用而出错。 我是否必须处理“NULL”条目并一个接一个地更新每个表,还是可以用一个命令来解决这个问题?像MySQLi_多_查询


多谢各位

您很可能必须按依赖性的顺序插入内容。因此,如果有三个表(A、B和C),我们将假设C依赖于B,B依赖于A。我们还将假设每个表分别有主键AID、BID和CID

  • 您可以将您的行插入一个列表并获得帮助
  • 然后使用从步骤1获得的帮助将行插入到B中
  • 然后使用从步骤2(可能还有步骤1)获得的出价(可能还有帮助)将行插入到C中

  • 您可以通过3种方法完成此操作:

    首先&推荐。在插入值中使用“选择”:

    第二。在插入值中使用最后一个插入ID:

    INSERT INTO a (id)
         VALUES ('anything');
    INSERT INTO user_details (id, weight, height)
         VALUES (LAST_INSERT_ID(),83, 185);
    
    第三,。使用PHP脚本

    <?php
    // Connecting to database
    $link = mysql_connect($wgScriptsDBServerIP, $wgScriptsDBServerUsername, $wgScriptsDBServerPassword, true);
    if(!$link || !@mysql_SELECT_db($wgScriptsDBName, $link)) {
    echo("Cant connect to server");
        exit;
    }
    
    // Values to insert
    $name = 'John Smith';
    $weight = 83;
    $height = 185;
    
    // insertion to user table
    $sql = "INSERT INTO user (name) VALUES ('$name')";
    $result = mysql_query( $sql,$conn );
    // retrieve last id
    $user_id = mysql_insert_id( $conn );
    mysql_free_result( $result );
    
    // insertion to user_details table
    $sql = "INSERT INTO user_details (id, weight, height) VALUES ($user_id, $weight, $height)";
    $result = mysql_query( $sql,$conn );
    mysql_free_result( $result );
    ?>
    

    方法1的语法中有错误

    INSERT INTO user_details (id, weight, height)
         VALUES (SELECT(id FROM user WHERE name='John Smith'), 83, 185);
    
    应该是

    INSERT INTO user_details (id, weight, height)
         VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185);
    
    (一) 外键的含义是将字段中的值与其他地方预先存在的值相关联。因此,您应该按照逻辑顺序进行插入

    (二) 如果您想避免逻辑限制,您应该

    SET foreign_key_checks = 0  // disable key checks in server
    INSERT ... // any order
    INSERT ...
    ...
    SET foreign_key_checks = 1
    

    你能把模式的相关部分贴出来吗?非常感谢。这很有帮助。按照您的方式,我们必须逐个执行sql,这可能会导致性能问题。是否有一种解决方案可以在一个sql中插入所有这些相关行?现在,我在想,如果我现在可以在没有插入行的情况下获得一个AID列表,你可以使用MySQL进行批量插入(我只在MSSQL中使用过它)。然后,您可以将所有三个大容量插入打包到一个事务中(因此,如果其中一个失败,所有插入都将回滚),并仔细考虑第一个和推荐的建议。这假设只有一个“约翰·史密斯”。若名称不是唯一的列,那个就是自找麻烦。使用LAST_INSERT_ID()是一种方法。这些多表插入是原子的吗?i、 e.更新了2个表或为零(如果存在任何中间错误)?还是必须使用
    开始事务
    来确保原子性?
    SET foreign_key_checks = 0  // disable key checks in server
    INSERT ... // any order
    INSERT ...
    ...
    SET foreign_key_checks = 1