2012-01-20 153 views
0

我在与外键的问题mysql.I'm试图在包含外键的表中插入行,但我有这个错误所面临的外键:麻烦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创建表表查询(温度和场合是源表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// 

如果有人能够帮助我,那将会很棒。 谢谢。

回答

0

您不能将调用的结果作为数组使用,因为它是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。因此,您可以使用该功能检索$tid,而不是在INSERT之后执行SELECT。此外,请仔细阅读SQL注入并花费一些时间让您的代码更安全并对代码进行格式化(缩进等)。你的代码有一些其他的错误,导致我认为你需要做更多的研究之前,继续...

+0

感谢milion.yes,你是对的,但我是编写mysql代码的初学者,如果像你这样的一些freinds引导我,我会很高兴。 – Madi

0

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

+0

当我想输出它根据PHP代码(echo $ tid;)有没有任何输出,但实际上它是在mysql中生成的,当我在mysql中写上面的查询时,它返回$ tid。 – Madi

+0

好吧,试着回显$ q2 - 然后你就可以看到查询是否正确。 – CompanyDroneFromSector7G