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