这些是我的表格:
create table sender(
sno varchar(6) not null,
sfname varchar(15) not null,
slname varchar(10) not null,
sphone varchar(10),
saddress varchar(40) not null,
constraint pk_sender primary key(sno)
);
create table courier(
cno varchar(6),
cost double precision not null,
weight double precision not null,
del_stat varchar(20) not null,
no_cour int(10),
sno varchar(6),
constraint fk_courier foreign key(sno)
references sender(sno),constraint pk_courier primary key(cno)
);
这是我的PHP代码:
<?php
session_start();
$_SESSION['x']=$_POST[sno];
$con=mysqli_connect("localhost","root","project123","project");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql1="insert into sender(sno,sfname,slname,sphone,saddress) values (concat('SN','$_POST[sno]'),'$_POST[sf]','$_POST[sl]','$_POST[sph]','$_POST[sad]')";
$sql2="insert into courier(cno,cost,weight,del_stat,no_cour) values (concat('CN','$_POST[cno]'),'$_POST[cst]','$_POST[wght]','$_POST[del]','$_POST[num]')";
if(!mysqli_query($con,$sql1) && !mysqli_query($con,$sql2))
{
die('Error: ' . mysqli_error($con));
}
mysqli_close($con);
?>
但是我收到了错误
错误:无法添加或更新子行:外键约束失败(project
。courier
,CONSTRAINT fk_courier
FOREIGN KEY(sno
)参考sender
( sno
))
所以请告诉我如何将值插入外键。
答案 0 :(得分:0)
您似乎没有在子表插入上设置外键值。您的courier
表格中有sno VARCHAR(6)
列引用sender.sno VARCHAR(6)
对吗?所以你必须提供它的价值。为了将两个字段关联为外键,您必须为父相关列上存在的子列设置有效值。
无论如何,你应该像这样运行这两个查询:
$sno = "SN$_POST[sno]";
$cno = "CN$_POST[cno]";
$sql1="insert into sender(sno,sfname,slname,sphone,saddress) values ('$sno','$_POST[sf]','$_POST[sl]','$_POST[sph]','$_POST[sad]')";
if(mysqli_query($con,$sql1))
{
$sql2="insert into courier(cno,cost,weight,del_stat,no_cour, sno) values ('$cno','$_POST[cst]','$_POST[wght]','$_POST[del]','$_POST[num]', '$sno')";
if (mysqli_query($con,$sql2))
{
// Success
}
else
{
die('Error on query 2: ' . mysqli_error($con));
}
}
else
{
die('Error on query 1: ' . mysqli_error($con));
}
您可以看到here如何从 auto_increment
字段中获取最后插入的ID。如果您没有使用auto_increment
字段,则必须以符合您需求的其他方式选择它。
我希望这会有所帮助。
更新:我已更改这些变量sno
和cno
,因为您可以避免在查询中将其连接起来。你可以这样做。我意识到您已经拥有sno
值,因此您无需再次查询。该代码现在可以正常工作。