Нужен хелп по связыванию в InnoDB

kate

Новичок
Нужен хелп по связыванию в InnoDB

Не получается создать внешний ключ.
Есть 2 таблицы, которые необходимо связать. parent и child (поля по которым необходимо связать имеют одинаковое название 'idr')
Поставила индексы на idr.

Пыталась связать через phpMyAdmin -> Связанный вид
пишет "Индекс не определен! (idr)"

Пробовала вручную SQL-кодом прописать:

ALTER TABLE child
ADD CONSTRAINT FOREIGN KEY (idr) REFERENCES parend(idr) ON DELETE CASCADE;

выдаёт ошибку
#1005 - Can't create table '.\cms\#sql-c40_106.frm' (errno: 150)

Помогите кто чем может...
 

svetasmirnova

маленький монстрик
>Поставила индексы на idr.
Вывод
[sql]
show create table parend;
[/sql]
в студию, пожалуйста.
 

kate

Новичок
пожалуйста:

Table | Create Table
parend | CREATE TABLE `parend` ( `idr` smallint(5) unsign...
 

kate

Новичок
CREATE TABLE `parend` (
`idr` smallint(5) unsigned NOT NULL auto_increment,
`pos` int(11) NOT NULL default '0',
`name` tinytext NOT NULL,
`addr` tinytext NOT NULL,
`title` tinytext NOT NULL,
`keyw` tinytext NOT NULL,
`desc_r` tinytext NOT NULL,
`h1` tinytext NOT NULL,
`content` text NOT NULL,
`hide` enum('show','hide') NOT NULL default 'show',
PRIMARY KEY (`idr`),
KEY `idr` (`idr`)
) TYPE=InnoDB
 

svetasmirnova

маленький монстрик
Зачем второй индекс KEY `idr` (`idr`)? И проверь определение столбца `idr` в таблице child.
 

kate

Новичок
При помощи "связанного вида"
вот такая штука выполнилась(после того как убрала KEY `idr` (`idr`)):

ALTER TABLE `child`
ADD CONSTRAINT `child_ibfk_1` FOREIGN KEY (`idr`) REFERENCES `child` (`idr`) ON DELETE CASCADE;

Только вот у меня смутные сомнения, что таблица child сама с собой связывается, ведь по идее в разделе REFERENCES должен быть родитель...

или я ошибаюсь?

спасибо!
 

kate

Новичок
Зачем второй индекс KEY `idr` (`idr`)?
Често сказать не знаю, мне посоветовали так сделать.
Но сейчас я его убрала.

Попробовала сделать запрос на БД:
ALTER TABLE child
ADD CONSTRAINT child_ibfk_1 FOREIGN KEY (idr) REFERENCES parend (idr) ON DELETE CASCADE

Он ругается:
Ответ MySQL:
#1005 - Can't create table '.\cms\#sql-140_1a.frm' (errno: 150)


"И проверь определение столбца `idr` в таблице child. "

CREATE TABLE `child` (
`idr` smallint(5) NOT NULL default '0',
`idp` int(6) unsigned NOT NULL auto_increment,
`pos` int(11) NOT NULL default '0',
`name` tinytext NOT NULL,
`addr` tinytext NOT NULL,
`title` tinytext NOT NULL,
`keyw` tinytext NOT NULL,
`desc_p` tinytext NOT NULL,
`h1` tinytext NOT NULL,
`content` text NOT NULL,
`hide` enum('show','hide') NOT NULL default 'show',
PRIMARY KEY (`idp`),
KEY `idr` (`idr`)
) TYPE=InnoDB

Не знаю что ему нужно?
 

svetasmirnova

маленький монстрик
> Не знаю что ему нужно?

Разницу видишь:

> CREATE TABLE `parend` (
>`idr` smallint(5) unsigned NOT NULL auto_increment,
и
> CREATE TABLE `child` (
> `idr` smallint(5) NOT NULL default '0',
?
 

kate

Новичок
вижу, спасибо!!!
получилось:)

-~{}~ 05.06.06 14:49:

Теперь ещё одна проблема не работает каскадное удаление :(
Вроде всё правильно сделано....но не хочет, пишет
#1217 - Cannot delete or update a parent row: a foreign key constraint fails

А вот каскадное обновление на с другими столбцами работает, что это может быть? Где собака зарыта?
 

kate

Новичок
согласна, тема другая, но всё же...
запрос на удаление делаю через phpMyAdmin или так:

PHP:
echo $idr;
$query1 = "DELETE FROM razdel WHERE idr='$idr'";
if(mysql_query($query1)){
echo "ok";
}
else puterror("error");
}
 
Сверху