Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
ON DELETE и ON UPDATE (kpblca) 24/07/2003 - 15:42:17
      Re: ON DELETE и ON UPDATE (walrus) 24/07/2003 - 17:57:17
      Re: ON DELETE и ON UPDATE (kpblca) 29/07/2003 - 13:00:30
      Re: ON DELETE и ON UPDATE (jjjj) 27/01/2007 - 19:09:58
      Re: ON DELETE и ON UPDATE (I) 03/11/2008 - 20:28:00

> Original message text:
> From: kpblca - 24/07/2003 - 15:42:17
> Subject:ON DELETE и ON UPDATE
> -----------------
> Не смотря на заверения документации, что сии ограничения на внешний ключ должны работать для таблиц InnoDB (ну не все ограничения, а некоторые) должны работать, у меня ни х.. не работает.
>
> [Цитата из документации]
> Начиная с версии 3.23.50 с ограничением внешнего ключа можно также связывать выражения ON DELETE CASCADE или ON DELETE SET NULL. Начиная с версии 4.0.8 вы можете это же использовать с ON UPDATE.
>
> Если указано выражение ON DELETE CASCADE и строка в родительской таблице удалена, то в формате InnoDB все эти строки автоматически удаляются также и из дочерней таблицы, значения внешнего ключа которой равны значениям ссылочного ключа в строке родительской таблицы. Если указано выражение ON DELETE SET NULL, строки дочерней таблицы автоматически обновляются, поэтому столбцам во внешнем ключе также присваивается значение SQL NULL.
> [Конец цитаты]
>
> Там же есть и пример, который у меня не работает ни хрена.
> Вот пример из док-ции:
>
> CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
> CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
> FOREIGN KEY (parent_id) REFERENCES parent(id)
> ON DELETE SET NULL
> ) TYPE=INNODB;
>
> А вот что я делал:
>
> Your MySQL connection id is 87 to server version: 3.23.56
>
> Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
>
> mysql> CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
> Query OK, 0 rows affected (0.00 sec)
>
> mysql> CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
> -> FOREIGN KEY (parent_id) REFERENCES parent(id)
> -> ON DELETE SET NULL
> -> ) TYPE=INNODB;
> Query OK, 0 rows affected (0.00 sec)
>
> mysql> insert into parent values (1), (2), (3);
> Query OK, 3 rows affected (0.00 sec)
> ???????: 3 ??????: 0 ??????????????: 0
>
> mysql> insert into child values (1,1), (2,2), (3,3);
> Query OK, 3 rows affected (0.00 sec)
> ???????: 3 ??????: 0 ??????????????: 0
>
> mysql> delete from parent where id=1;
> Query OK, 1 row affected (0.00 sec)
>
> mysql> select * from child ;
> +------+-----------+
> | id | parent_id |
> +------+-----------+
> | 1 | 1 |
> | 2 | 2 |
> | 3 | 3 |
> +------+-----------+
> 3 rows in set (0.00 sec)
>
> mysql>
>
> Просите за не ту кодировку, она при вставке так получилась.
> Итак, я не вижу значения null для поля parent_id в строке, где id=3 в таблице child.
>
> Тот же пример в Mysql 4.0.1 ругается на команде
> delete from parent where id=1;
> (что-то вроде: не могу удалить из-за поля parent_id, связанного внешним ключом) хотя ограничение стоит SET NULL !!!!
>
> Очевидно, что сия оказия есть некий баг, так как поведение системы явно не соответсвует док-ции.
> Отсюда у меня вытекает
> Вопрос: у кого-нибудь в MySQL работают ограничения на внешние ключи, и если работает, то в какой версии.
>


From: walrus - 24/07/2003 - 17:57:17
Subject:ON DELETE и ON UPDATE
-----------------
повторяем то что вы делали:

Your MySQL connection id is 1 to server version: 4.0.14

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
Query OK, 0 rows affected (0.20 sec)

mysql> CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL ) TYPE=INNODB;
Query OK, 0 rows affected (0.08 sec)

mysql> insert into parent values (1), (2), (3);
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> insert into child values (1,1), (2,2), (3,3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> delete from parent where id=1;
Query OK, 1 row affected (0.04 sec)

mysql> select * from child ;
+------+-----------+
| id | parent_id |
+------+-----------+
| 1 | NULL |
| 2 | 2 |
| 3 | 3 |
+------+-----------+
3 rows in set (0.03 sec)



У меня работает. предположение номер 1: ваш mysql скомпилирован без поддержки innodb. В таком случае он все эти слова типа type=innodb, foreign key и тд просто пропускает мимо ушей. (не выдает ощибку, а просто делает обычную myisam таблицу). Проверить просто:

У меня вдает вот как:

mysql> show create table child \G
*************************** 1. row ***************************
Table: child
Create Table: CREATE TABLE `child` (
`id` int(11) default NULL,
`parent_id` int(11) default NULL,
KEY `par_ind` (`parent_id`),
CONSTRAINT `0_68` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE SET NULL
) TYPE=InnoDB
1 row in set (0.00 sec)


Проверьте, если у вас получается типа (т.е тип myisam), то вы скомпилированы без поддержки innodb (или сервер запущен с ключем --skip-innodb):

mysql> show create table parent;
+--------+--------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+--------------------------------------------------------------------------------------------------+
| parent | CREATE TABLE `parent` (
`id` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM |
+--------+--------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
34426



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |