Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
1

Не работает ON DELETE CASCADE

25.10.2014, 01:01. Показов 6030. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такая таблица:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE questions ( 
    q_id    INTEGER PRIMARY KEY AUTO_INCREMENT,
    test_id INTEGER REFERENCES tests ( test_id ) ON DELETE CASCADE
                                                 ON UPDATE CASCADE,
    q_text  TEXT    NOT NULL,
    q_bal   INTEGER,
    q_Atype INTEGER NOT NULL 
);
Но, при удалении какой-либо строчки в теблице tests, связанные с ней строчки в этой таблице не удаляются...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2014, 01:01
Ответы с готовыми решениями:

БД аэропорта, где выбрать On Delete/Update Cascade/Restrict
Какие могут быть варианты, чтобы при изменении части данных, не изменились бы нежелательные к...

EF Cascade delete удаляет записи которые должны быть модифицированы
Есть таблица в бд. CREATE TABLE ContextMenuItem( NOT NULL, NULL, (max) NOT NULL, ...

Клавиша delete не работает,а вот shift + delete работает
Ни ничего не могу удалить как обычно клавишей delete работает только при сочетании shift + delete...

Стандартная функция delete в Eclipse работает а в AndroidStudio не работает
case R.id.btnDelete: {//Кнопка удаление последнего символа ...

9
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
28.10.2014, 18:25  [ТС] 2
В общем, я разобрался.

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

При несоблюдении одного из вышеперечисленных пунктов, при создании таблицы будет возникать ошибка:
Cannot add foreign key constraint

А, да, и когда я пытался задать столбцу свойство "вторичный ключ" непосредственно при его создании, он не создавался вообще

И ещё одно, желательно указывать одинаковые свойства DELETE и UPDATE, например:
SQL
1
2
ON DELETE CASCADE
       ON UPDATE CASCADE
В итоге, создание таблицы выглядит так:
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE questions ( 
    id      INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    test_id INTEGER UNSIGNED,
    q_text  VARCHAR(255)     NOT NULL,
    q_bal   INTEGER          NOT NULL,
    q_Atype INTEGER          NOT NULL,
    PRIMARY KEY(`id`),
    FOREIGN KEY (test_id) REFERENCES tests (id) 
       ON DELETE CASCADE
       ON UPDATE CASCADE
);
А, и кстати, чтобы удалить таблицу, в которой есть вторичные ключи, нужно сначала отключить их проверку.
Вот пример запроса для удаления таблицы questions:
SQL
1
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE questions; SET FOREIGN_KEY_CHECKS = 1;
Если этого не сделать, при удалении будет возникать ошибка:
Cannot delete or update a parent row: a foreign key constraint fails
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
28.10.2014, 18:41 3
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
вторичного ключа
"Это" называется внешним ключом. От англ. foreign key
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
желательно указывать одинаковые свойства DELETE и UPDATE
Очень большая ошибка
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
чтобы удалить таблицу, в которой есть вторичные ключи, нужно сначала отключить их проверку
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
Если этого не сделать, при удалении будет возникать ошибка
Не факт, только при наличии связанных записей
0
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
28.10.2014, 18:45  [ТС] 4
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Сообщение от maxkoshevoi
чтобы удалить таблицу, в которой есть вторичные ключи, нужно сначала отключить их проверку
Если этого не сделать, при удалении будет возникать ошибка

Не факт, только при наличии связанных записей
Я пытался удалить таблицу срезу после её создания (для эксперимента) и возникала эта ошибка
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
Сообщение от maxkoshevoi
желательно указывать одинаковые свойства DELETE и UPDATE

Очень большая ошибка
В чём именно?
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
"Это" называется внешним ключом.
Ну, их вроде и так, и так называют. Но всё равно спасибо, учту =)
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
29.10.2014, 07:04 5
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
В чём именно?
В том, что
Цитата Сообщение от maxkoshevoi Посмотреть сообщение
желательно указывать одинаковые свойства DELETE и UPDATE
Это, возможно, желательно делать в вашей реализации структуры БД, но не стоит писать абстрактно, что это желательно делать, а то кто-нибудь забьет себе это в голову. У нас был разработчик, который придерживался похожего принципа, одним незадокументированным действием пользователя потеряли половину БД, полдня дамп синхронизировали с текущим состоянием БД.
0
5 / 5 / 1
Регистрация: 08.05.2011
Сообщений: 121
24.05.2015, 13:19 6
У меня такая же проблема. Удаляю строчку из таблицы(attributes), по внешнему ключу (поле attr_id) должно пройти удаление в двух таблицах - params,references. В итоге нигде ничего не удаляется.

Может ли проблема быть в именах ключей? Может их надо сделать с одинаковыми именами?
Или проблема в том что висит ещё зависимость на таблицу objects? То есть строка в params не удалится пока любой из внешних ключей ссылается на существующую строку

Описание таблиц и ключей:
Кликните здесь для просмотра всего текста
SQL
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
CREATE TABLE IF NOT EXISTS `attributes` (
  `attr_id` INT(10) NOT NULL,
  `attr_type_id` INT(10) NOT NULL,
  `attr_group_id` INT(10) DEFAULT NULL,
  `name` VARCHAR(300) NOT NULL,
  PRIMARY KEY (`attr_id`),
  KEY `attr_type_id` (`attr_type_id`),
  KEY `attr_group_id` (`attr_group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `params` (
  `attr_id` INT(10) NOT NULL,
  `object_id` INT(10) NOT NULL,
  `value` VARCHAR(1000) NOT NULL,
  KEY `object_id` (`object_id`),
  KEY `attr_id` (`attr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `referencess` (
  `attr_id` INT(10) NOT NULL,
  `object_id` INT(10) NOT NULL,
  `reference` INT(10) NOT NULL,
  KEY `attr_id` (`attr_id`),
  KEY `object_id` (`object_id`),
  KEY `reference` (`reference`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
--
-- Constraints for table `attributes`
--
ALTER TABLE `attributes`
  ADD CONSTRAINT `attributes_ibfk_1` FOREIGN KEY (`attr_group_id`) REFERENCES `attr_groups` (`attr_group_id`) ON DELETE SET NULL ON UPDATE NO ACTION;
 
 
--
-- Constraints for table `params`
--
ALTER TABLE `params`
  ADD CONSTRAINT `params_ibfk_1` FOREIGN KEY (`attr_id`) REFERENCES `attributes` (`attr_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `params_ibfk_2` FOREIGN KEY (`object_id`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE NO ACTION;
 
  
--
-- Constraints for table `referencess`
--
ALTER TABLE `referencess`
  ADD CONSTRAINT `referencess_ibfk_3` FOREIGN KEY (`reference`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `referencess_ibfk_1` FOREIGN KEY (`attr_id`) REFERENCES `attributes` (`attr_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `referencess_ibfk_2` FOREIGN KEY (`object_id`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE NO ACTION;
0
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
24.05.2015, 13:30  [ТС] 7
vvApache, попробуйте переименовать столбцы на которые вы ссылаетесь. Т.е. чтобы названия связанного и основного (честно, я без понятия, как их повторно назвать) столбцов различались.
0
5 / 5 / 1
Регистрация: 08.05.2011
Сообщений: 121
24.05.2015, 14:16 8
спасибо, но если честно, не думаю что в этом проблема
если я их переименую то нарушу наглядность структуры бд
0
73 / 73 / 23
Регистрация: 07.11.2013
Сообщений: 539
24.05.2015, 14:31  [ТС] 9
vvApache, да нет, просто переименуйте столбец-первичный ключ каждой таблицы на id
0
5 / 5 / 1
Регистрация: 08.05.2011
Сообщений: 121
25.05.2015, 20:28 10
Экспериментально выяснил из-за чего не удаляет по констрейнтам:
SQL
1
2
3
4
ALTER TABLE `referencess`
  ADD CONSTRAINT `referencess_ibfk_3` FOREIGN KEY (`reference`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `referencess_ibfk_1` FOREIGN KEY (`attr_id`) REFERENCES `attributes` (`attr_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  ADD CONSTRAINT `referencess_ibfk_2` FOREIGN KEY (`object_id`) REFERENCES `objects` (`object_id`) ON DELETE CASCADE ON UPDATE NO ACTION;
Из-за того что в этой таблице два внешних ключа ссылается на одно и тоже поле другой таблицы.
Можно ли что-то с этим сделать, не убирая зависимостей?
0
25.05.2015, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2015, 20:28
Помогаю со студенческими работами здесь

Почему не работает Update, но работает аналогичный Delete?
В xmal есть datagrid в него подтянута из базы информация. Название и количество. Надо сделать во...

Не работает delete
uses crt; var k:array of integer; karta,scopei,scopek,wi,wk,m,st:integer; kl:char;...

Table->Delete не работает
Я добавляю в DBGrid с помощью Select запроса данные из нескольких Table, мне надо удалить выбранную...

Не работает триггер after delete
/*Удаляю все пациентов, которые не оплатили лечение */ create trigger client_money_delete1 on...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru