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

Использую innodb, там есть возможность задавать foreign keys. Есть, наример, таблица companies и есть таблицы которые с ней связаны, например, accounts, orders и т.п. Если я удаляю запись в таблице companies то удаляются соответсвующие записи и во всех связанных таблицах. А можно ли сделать обратную вещь - пока существуют записи в связанных таблицах, то из таблицы companies ничего удалить нельзя? Рылся в хелпах mysql и inet-е но ничего толком не нашел... может я чего-то упустил? Подскажите пожалста если кто знает : )
...
Рейтинг: 0 / 0
Foreign keys
    #32696475
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задай ключи наоборот. И констрейнты повесь.
правда, не знаю, с какой версии мускул это поддерживает.
Перейди на PostgreSQL. Там все проще и богаче.
...
Рейтинг: 0 / 0
Foreign keys
    #32696504
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я б на Postgres перешел : ) Осталось уболтать заказчиков... Mysql с констрейтами только в innodb таблицах работает, с 4.х и в 5 альфе точно, более старые не проверял. Наоборот пробовал задать но че-то не проходит...
...
Рейтинг: 0 / 0
Foreign keys
    #32696663
Bigharryy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ON DELETE CASCADE - удалить в подчиненных
ON DELETE RESTRICT - запретить удаление, если есть подчиненные
...
Рейтинг: 0 / 0
Foreign keys
    #32697376
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
on delete restrict тоже пробовал но почему-то не хочет ставиться, еще пробовал сначала SET FOREIGN_KEY_CHECKS = 0; затем on delete restrict, все равно облом
...
Рейтинг: 0 / 0
Foreign keys
    #32697652
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что говорит-то? Он должен что-то в консоль выдавать...
...
Рейтинг: 0 / 0
Foreign keys
    #32698025
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдавалось 1216 - Cannot add or update a child row: a foreign key constraint fails
Я пока все проверки перед удалением на php реализовал, но это не сильно удобно, особенное если прийдется кучу новых таблиц добавлять, буду еще эксперементировать
...
Рейтинг: 0 / 0
Foreign keys
    #32699298
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая ошибка вылазит, кады в подчиненной таблице есть ключевые записи, которых нет в парентной таблице - вот ему и не создать индекс.
Выловить эти записи просто:
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
Foreign keys
    #32699973
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Записи были с нормально прописанными id (я на паре тестовых таблиц пробовал), самое забавное что on delete cascade ставилось, а on delete restrict нет
...
Рейтинг: 0 / 0
Foreign keys
    #32700091
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите пожалуйста на примере когда on delete cascade работает а restrict - нет. Что то вы (не обижайтесь) гоните.
...
Рейтинг: 0 / 0
Foreign keys
    #32700125
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А CONSTRAINT указывали?
...
Рейтинг: 0 / 0
Foreign keys
    #32700272
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо действительно гоню : ) сейчас RESTRICT отрабатывается. Всем спасибо за помошь
...
Рейтинг: 0 / 0
Foreign keys
    #32700302
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если имеются две таблички с одним родителем, но в одной - стоит рестрикт, а в другой - каскад - и при удалении записи из родителя если сработает рестрикт - то каскад на другой таблице отменится или нет?
Вроде - должен - по идее - это транзакция - или - в Мускуле это не так?
...
Рейтинг: 0 / 0
Foreign keys
    #32700843
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хороший вопрос, не знаю если честно : ) Я недавно начал со всем этим разбираться
...
Рейтинг: 0 / 0
Foreign keys
    #32700860
Temka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я попробовал случай с двумя табличками

Код: 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
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Foreign keys
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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