Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Foreign keys / 15 сообщений из 15, страница 1 из 1
15.09.2004, 18:49
    #32696421
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Привет всем!

Использую innodb, там есть возможность задавать foreign keys. Есть, наример, таблица companies и есть таблицы которые с ней связаны, например, accounts, orders и т.п. Если я удаляю запись в таблице companies то удаляются соответсвующие записи и во всех связанных таблицах. А можно ли сделать обратную вещь - пока существуют записи в связанных таблицах, то из таблицы companies ничего удалить нельзя? Рылся в хелпах mysql и inet-е но ничего толком не нашел... может я чего-то упустил? Подскажите пожалста если кто знает : )
...
Рейтинг: 0 / 0
15.09.2004, 19:07
    #32696475
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Задай ключи наоборот. И констрейнты повесь.
правда, не знаю, с какой версии мускул это поддерживает.
Перейди на PostgreSQL. Там все проще и богаче.
...
Рейтинг: 0 / 0
15.09.2004, 19:17
    #32696504
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Я б на Postgres перешел : ) Осталось уболтать заказчиков... Mysql с констрейтами только в innodb таблицах работает, с 4.х и в 5 альфе точно, более старые не проверял. Наоборот пробовал задать но че-то не проходит...
...
Рейтинг: 0 / 0
15.09.2004, 22:39
    #32696663
Bigharryy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
ON DELETE CASCADE - удалить в подчиненных
ON DELETE RESTRICT - запретить удаление, если есть подчиненные
...
Рейтинг: 0 / 0
16.09.2004, 12:12
    #32697376
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
on delete restrict тоже пробовал но почему-то не хочет ставиться, еще пробовал сначала SET FOREIGN_KEY_CHECKS = 0; затем on delete restrict, все равно облом
...
Рейтинг: 0 / 0
16.09.2004, 13:31
    #32697652
BigHarry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
А что говорит-то? Он должен что-то в консоль выдавать...
...
Рейтинг: 0 / 0
16.09.2004, 15:15
    #32698025
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Выдавалось 1216 - Cannot add or update a child row: a foreign key constraint fails
Я пока все проверки перед удалением на php реализовал, но это не сильно удобно, особенное если прийдется кучу новых таблиц добавлять, буду еще эксперементировать
...
Рейтинг: 0 / 0
17.09.2004, 10:53
    #32699298
BigHarry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Такая ошибка вылазит, кады в подчиненной таблице есть ключевые записи, которых нет в парентной таблице - вот ему и не создать индекс.
Выловить эти записи просто:
SELECT child_table.child_key FROM child_table
LEFT JOIN parent_table ON (child_table.child_key = parent_table.parent_key)
WHERE child_table.child_key IS NOT NULL AND parent_table.parent_key IS NULL
...
Рейтинг: 0 / 0
17.09.2004, 14:40
    #32699973
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Записи были с нормально прописанными id (я на паре тестовых таблиц пробовал), самое забавное что on delete cascade ставилось, а on delete restrict нет
...
Рейтинг: 0 / 0
17.09.2004, 15:37
    #32700091
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Покажите пожалуйста на примере когда on delete cascade работает а restrict - нет. Что то вы (не обижайтесь) гоните.
...
Рейтинг: 0 / 0
17.09.2004, 15:53
    #32700125
BigHarry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
А CONSTRAINT указывали?
...
Рейтинг: 0 / 0
17.09.2004, 16:50
    #32700272
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Видимо действительно гоню : ) сейчас RESTRICT отрабатывается. Всем спасибо за помошь
...
Рейтинг: 0 / 0
17.09.2004, 17:04
    #32700302
BigHarry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
А если имеются две таблички с одним родителем, но в одной - стоит рестрикт, а в другой - каскад - и при удалении записи из родителя если сработает рестрикт - то каскад на другой таблице отменится или нет?
Вроде - должен - по идее - это транзакция - или - в Мускуле это не так?
...
Рейтинг: 0 / 0
18.09.2004, 14:06
    #32700843
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Хороший вопрос, не знаю если честно : ) Я недавно начал со всем этим разбираться
...
Рейтинг: 0 / 0
18.09.2004, 14:52
    #32700860
Temka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Foreign keys
Я попробовал случай с двумя табличками

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
CREATE TABLE `parent` (
  `parent_id` int( 11 ) NOT NULL auto_increment,
  `name` varchar( 32 ) NOT NULL default '',
  PRIMARY KEY  (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT= 3  ;

INSERT INTO `parent` VALUES ( 2 , 'parent1');

CREATE TABLE `child1` (
  `child_id` int( 11 ) NOT NULL auto_increment,
  `parent_id` int( 11 ) NOT NULL default '0',
  `name` varchar( 32 ) NOT NULL default '',
  PRIMARY KEY  (`child_id`),
  KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT= 3  ;


INSERT INTO `child1` VALUES ( 1 ,  2 , 'child1_1');
INSERT INTO `child1` VALUES ( 2 ,  2 , 'child1_2');

ALTER TABLE `child1` ADD CONSTRAINT FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`) ON DELETE CASCADE;

CREATE TABLE `child2` (
  `child_id` int( 11 ) NOT NULL auto_increment,
  `parent_id` int( 11 ) NOT NULL default '0',
  `name` varchar( 32 ) NOT NULL default '',
  PRIMARY KEY  (`child_id`),
  KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT= 3  ;

INSERT INTO `child2` VALUES ( 1 ,  2 , 'child2_1');
INSERT INTO `child2` VALUES ( 2 ,  2 , 'child2_2');

ALTER TABLE `child2` ADD CONSTRAINT FOREIGN KEY (`parent_id`) REFERENCES `parent` (`parent_id`);

В этом случае запись из parent удалить не получается, MySQL выдает #1217 - Cannot delete or update a parent row: a foreign key constraint fails
сascade соответственно тоже не отработал
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Foreign keys / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]