FOREIGN KEY не устанавливается

Safary

Новичок
FOREIGN KEY не устанавливается

Вот такой у меня запрос:
PHP:
CREATE TABLE `sections` (
`id` INT( 7 ) NOT NULL AUTO_INCREMENT ,
`pid` INT( 7 ) DEFAULT NULL ,
`sort` VARCHAR( 255 ) DEFAULT '0' NOT NULL ,
`level` INT( 2 ) DEFAULT '1' NOT NULL ,
`link` VARCHAR( 255 ) DEFAULT NULL ,
`type` INT( 1 ) DEFAULT '1' NOT NULL ,
`section` VARCHAR( 255 ) DEFAULT NULL ,
`name` VARCHAR( 255 ) DEFAULT NULL ,
PRIMARY KEY ( `id` ),
FOREIGN KEY (pid) REFERENCES sections(id)
ON UPDATE CASCADE ON DELETE CASCADE
);
внешний ключ не устанавливается почему-то, пока я его через PHPMYADMIN не установлю, а там запрос не показывает... Подскажите, а?

-~{}~ 01.04.09 08:09:

Странно, даже в ПхпМайАдмине сейчас поставил внешний ключ, ну сразу понятно что он стоит, т.к. на PID значения - ссылки, если кликнуть - то найдет ID, такой-же как значение PID.

Но что странно - меняю ID у записи, а PID, который ссылался на этот ID не меняется, остается таким-же, как и был. Почему???
Он же меняться должен...
 

Духовность™

Продвинутый новичок
я счетаю, что ВНЕШНИЕ ключи тебе пока не нужны. они вообще крайне редко применчяются. и то, на таблицах InnoDB.
 

CHEM_Eugene

Новичок
Re: FOREIGN KEY не устанавливается

Автор оригинала: Safary
Но что странно - меняю ID у записи, а PID, который ссылался на этот ID не меняется, остается таким-же, как и был. Почему???
Он же меняться должен...
И что меняется ID? Вообще должен ругнуться ошибкой. По крайней мере у меня в такой ситуации ругался так: Cannot delete or update a parent row: a foreign key constraint fails
 

Safary

Новичок
а почему поле с ключом у меня ссылкой показывает и если кликаю - родителя находит?

triumvirat, ещё как нужны! они мне позарез сейчас нужны.. честно.

CHEM_Eugene, а как сделать-то чтоб ругнулся хотябы?
Дайте SQL-запрос...
 

dimagolov

Новичок
Safary, все зависит от того, какое действие прописано в ключе на ON UPDATE. Если RESTRICT, то ругнется, если CASCADE то обновит. По умолчанию RESTRICT (если опустить ON UPDATE), но у тебя то все прописано, так что все должно работать

Не понимаю, чего ты ожидаешь и почему думаешь, что что-то не так. Проверка простая - руками поменяй ID в основной таблице (у предка) и автоматом ссылки на измененную запись должны поменяться у детей.

еще можно просто посмотреть SHOW CREATE TABLE чтобы убедиться, что ключ там таки есть.

первоисточник

CHEM_Eugene, ты выбери, что тебе больше по душе - орбит или дирол, ладно?
 

Safary

Новичок
PHP:
CREATE TABLE `sections` (\n  `id` int(7) NOT NULL auto_increment,\n  `pid` int(7) default NULL,\n  `sort` varchar(255) default NULL,\n  `level` int(2) default NULL,\n  `link` varchar(255) default NULL,\n  `type` varchar(1) NOT NULL,\n  `section` varchar(255) default NULL,\n  `name` varchar(255) default NULL,\n  PRIMARY KEY  (`id`),\n  UNIQUE KEY `id` (`id`)\n) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=cp1251
Странно, ключа нет, тамблица - MyISAM, а внешний ключ, кот. я установил через базу работает! =)
Пачиму?

-~{}~ 01.04.09 20:35:

CHEM_Eugene, да, понял! жуй свой орбит :D
 

Beavis

Banned
Ты установил связь, которая хранится в системных таблицах phpMyAdmin'a и видима только для него...
 

Safary

Новичок
Beavis, угу понял. тоесть системная связь устанавливаться может на любую таблицу?

dimagolov, ок. понял. Сейчас заново всё заново сделаю по-нормальному, покажу sql-запрос и отпишусь получилось или нет :)

-~{}~ 01.04.09 22:07:

Очень странно, создал таблицу вот так:
PHP:
CREATE TABLE `structure` (
`id` int(7) NOT NULL auto_increment,
`pid` int(7) default NULL,
`sort` varchar(255) default NULL,
`level` int(2) default NULL,
`link` varchar(255) default NULL,
`type` varchar(1) NOT NULL,
`section` varchar(255) default NULL,
`name` varchar(255) default NULL,
PRIMARY KEY  (`id`),
UNIQUE KEY `id` (`id`),
FOREIGN KEY (pid) REFERENCES structure(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=cp1251
вот что выдает show create table:
PHP:
CREATE TABLE `structure` (
`id` int(7) NOT NULL auto_increment,
`pid` int(7) default NULL,
`sort` varchar(255) default NULL,
`level` int(2) default NULL,
`link` varchar(255) default NULL,
`type` varchar(1) NOT NULL,
`section` varchar(255) default NULL,
`name` varchar(255) default NULL,
PRIMARY KEY  (`id`),\n  UNIQUE KEY `id` (`id`),
KEY `pid` (`pid`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=cp1251
 

Gas

может по одной?
а innodb движок вообще включен? что говорит запрос
[sql]show variables like 'have_innodb';[/sql]
 

dimagolov

Новичок
думаю, что проблема в том, что
InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan
, а индекса по pid как раз и нету.

-~{}~ 01.04.09 16:52:

да, и ты ведь не прибиваешь таблицу перед тем, как создаешь? естественно, она повторно не создается. и потом, есть ведь ALTER TABLE, которым можно менять существующую, а не создавать все время новую.
 

Safary

Новичок
Gas, да, проблемма в этом :)
Вот что говорит запрос:
PHP:
have_innodb 	DISABLED
как включить?

dimagolov, всмысле не прибиваю? DROP TABLE конечно делаю перед созданием новой, индекс по PID у меня есть..
Ещё уникальный на ID и первичный тоже на ID. Всё как надо )
Про ALTER TABLE знаю, просто сейчас отрабатываю создание таблицы для install.php :)
 

Safary

Новичок
щас почитаю...
ещё вот такой вопрос:
как объединить команды в SQL-запросе?
PHP:
CREATE TABLE `pages` (
...
); ENGINE=InnoDB DEFAULT CHARSET=cp1251

CREATE TABLE `structure` (
...
); ENGINE=InnoDB DEFAULT CHARSET=cp1251
Вот так пытаюсь.
Ну да, ман читать пошлете, знаю :) И правильно кстати!
 

pilot911

Новичок
CREATE TABLE `structure` (
...
); <---- в связи с чем этот знак на этом месте ?
 

Safary

Новичок
ну типа чтоб 2 таблицы создать в одном запросе, но я понимаю что это неправильно. а как правильно?
 

pilot911

Новичок
CREATE TABLE `pages` (
...
)ENGINE=InnoDB DEFAULT CHARSET=cp1251;

CREATE TABLE `structure` (
...
)ENGINE=InnoDB DEFAULT CHARSET=cp1251;


точка с запятой означают окончание запроса
 

Safary

Новичок
pilot911, попробовал так, не получилось, вообще ни одна не создалась так...

Кстати с InnoDB проблему решил, разобрался :)

-~{}~ 02.04.09 01:57:

ну как блин эти чертовы запросы разделять-то? =)
 
Сверху