在mysql中使用外键的麻烦

时间:2012-01-20 15:20:13

标签: mysql foreign-keys

我在mysql中遇到外键问题。我试图在包含外键的表中插入一行,但我遇到了这个错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`prj1`.`tempoccasion`, CONSTRAINT `tempoccasion_ibfk_1` FOREIGN KEY (`tempid`) REFERENCES `temp` (`tempid`) ON DELETE CASCADE ON UPDATE CASCADE)

我已经对表执行了SHOW CREATE TABLE查询(temp和场合是源表 - tempoccasion是带有外键的表)

CREATE TABLE `temp` (
 `tempid` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
 `image` text NOT NULL,
 `code` text NOT NULL,
 PRIMARY KEY (`tempid`),
 UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT
n   CREATE TABLE `occasion` (
 `occasionid` int(11) NOT NULL AUTO_INCREMENT,
 `occasionname` varchar(30) CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
 `year` varchar(11) NOT NULL,
 `month` varchar(11) NOT NULL,
 `day` varchar(11) NOT NULL,
 `comment` text CHARACTER SET utf8 COLLATE utf8_persian_ci NOT NULL,
 PRIMARY KEY (`occasionid`),
 UNIQUE KEY `occasionname` (`occasionname`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT
    CREATE TABLE `tempoccasion` (
 `tempid` int(11) NOT NULL,
 `occasionid` int(11) NOT NULL,
 PRIMARY KEY (`tempid`,`occasionid`),
 KEY `occasionid` (`occasionid`),
 CONSTRAINT `tempoccasion_ibfk_2` FOREIGN KEY (`occasionid`) REFERENCES `occasion` (`occasionid`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `tempoccasion_ibfk_1` FOREIGN KEY (`tempid`) REFERENCES `temp` (`tempid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT

发生错误的查询(用php编写):

$tn=$_GET["tname"];
$on=$_GET["oid"];
$i=$_GET["image"];
$c=$_GET["code"];
$q="insert into temp(name,image,code)values('$tn','$i','$c')";
$r=mysql_query($q)or die("invalid query");

if ($r)
{
$q1="select tempid from temp where name like '$tn'";
$row1=mysql_query($q1)or die("invalid query1");
if ($row1)
{
$tid=$row1['tempid'];
echo $tid;
$q2="insert into tempoccasion (tempid,occasionid)values('$tid','$on')";
$r2=mysql_query($q2)or die("invalid query2");//this query contains error//

如果有人能帮助我会很棒。 感谢。

2 个答案:

答案 0 :(得分:0)

$ tid有效吗? 你能输出它来证明这是正确的吗?

答案 1 :(得分:0)

您不能将调用mysql_query的结果用作数组,因为它是MySQL结果集。您可以使用mysql_fetch_assoc()从该结果集中获取各行。在您的情况下,您需要执行以下操作:

[snip]
$q1="select tempid from temp where name like '$tn'";
$result1=mysql_query($q1)or die("invalid query1");
if ($result1)
{
$row1 = mysql_fetch_assoc($result1);
$tid=$row1['tempid'];
echo $tid;
[/snip]

您还可以使用mysql_insert_id()获取上次插入记录的ID。因此,您可以使用该函数检索SELECT,而无需在INSERT后执行$tid

此外,请阅读SQL注入,并花一些时间让您的代码更安全,并格式化(缩进等)您的代码。您的代码还有其他一些问题导致我认为您需要在继续之前进行更多研究...