проблема с внешним ключом в MySQL - PullRequest
0 голосов
/ 20 января 2012

У меня проблема с внешним ключом в 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)

У меня естьdone SHOW CREATE TABLE - запрос к таблицам (временная и временная исходная таблица-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 голосов
/ 20 января 2012

Вы не можете использовать результат вызова 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(), чтобы получить идентификатор последней вставленной записи.Таким образом, вместо SELECT после INSERT вы можете использовать эту функцию для получения $tid.

Более того, пожалуйста, ознакомьтесь с SQL-инъекциями и потратьте некоторое время на то, чтобы сделать ваш код более безопасным и отформатировать(отступ и т. д.) вашего кода.Что-то не так с вашим кодом, что заставляет меня думать, что вам нужно провести еще какое-то исследование, прежде чем продолжить ...

0 голосов
/ 20 января 2012

Допустим ли $ tid? Можете ли вы вывести его, чтобы доказать, что это правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...