Нужно что бы при удалении записи из одной таблицы удалялось соответствие другой.
Таблица категорий:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`left_key` int(10) NOT NULL,
`right_key` int(10) NOT NULL,
`level` int(10) NOT NULL,
`serial_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `key` (`left_key`,`right_key`,`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Таблица записей:
CREATE TABLE IF NOT EXISTS `serials` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`ganre` varchar(255) NOT NULL,
`logo` varchar(100) NOT NULL,
`year` int(5) NOT NULL,
`actors` varchar(255) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=24 ;
Связка происходит в поле tree.serial_id. Там лежи id добавленного материала.
Как сделать так, что бы при удалении записи, удалялось бы и поле с "serial_id" id нашей записи.
Спустя 4 минуты, 45 секунд (11.10.2011 - 14:02) m4a1fox написал(а):
пошукай в google'e там есть! Сложные запросы к БД на php!
Спустя 3 минуты, 30 секунд (11.10.2011 - 14:06) RCuPeR написал(а):
m4a1fox, на сколько я знаю, можно сделать и без php. Мускул как-то сам удаляет. Это делается при правильном оперировании ключей и индексов. Вот, хочу узнать что именно нужно.
Свернутый текст
В гугл посылать нехитрая задача. Я тебя прошу, не флуди.
Спустя 8 минут, 34 секунды (11.10.2011 - 14:14) h234 написал(а):
ALTER TABLE `tree` ADD INDEX ( `serial_id` );
ALTER TABLE `tree` ADD CONSTRAINT `tree_fk_1` FOREIGN KEY (`serial_id`) REFERENCES `serials` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Спустя 4 минуты, 14 секунд (11.10.2011 - 14:18) h234 написал(а):
ЗЫ таблицы должны быть в InnoDB, исправьте: ENGINE=InnoDB
Спустя 2 минуты, 8 секунд (11.10.2011 - 14:20) RCuPeR написал(а):
Спасибо большое. Можно поинтересоваться, что такое "`tree_fk_1`" ?
Спустя 27 минут, 20 секунд (11.10.2011 - 14:48) h234 написал(а):
Это имя внешнего ключа. На случай удаления или модификации
Спустя 6 минут, 29 секунд (11.10.2011 - 14:54) RCuPeR написал(а):
Цитата (h234 @ 11.10.2011 - 11:48) |
Это имя внешнего ключа. На случай удаления или модификации |
Ошибка
SQL-запрос:
ALTER TABLE `tree` ADD CONSTRAINT `tree_fk_1` FOREIGN KEY ( `serial_id` ) REFERENCES `serials` ( `id` ) ON DELETE CASCADE ON UPDATE CASCADE ;
Ответ MySQL:
#1005 - Can't create table 'serial.#sql-37a_1cf' (errno: 121)
Спустя 10 минут, 36 секунд (11.10.2011 - 15:05) h234 написал(а):
А индекс то добавили для serial_id?
если да, то покажите ваш дамп:
если да, то покажите ваш дамп:
mysqldump --databases имя_вашей_базы -u пользователь -p > /путь_куда_сохранить/dump.sql
Спустя 31 минута, 23 секунды (11.10.2011 - 15:36) RCuPeR написал(а):
Цитата (h234 @ 11.10.2011 - 12:05) |
А индекс то добавили для serial_id? если да, то покажите ваш дамп:
|
Нет, не ставил индекс. Честно говоря, даже не знаю как это делается.
В аттаче дамп.
Спустя 4 минуты, 59 секунд (11.10.2011 - 15:41) alexbel2404 написал(а):
читай про триггеры.
Спустя 30 минут, 41 секунда (11.10.2011 - 16:12) h234 написал(а):
Во-первых `serial_id` выносим в отдельный index, а не в составной:
Во- вторых, если посмотреть дамп, можно увидеть запись
Обратите внимание на (1,'<root>',1,16,0,0), где serial_id = 0, что не может быть при добавлении FK
Удалите эту запись или исправьте в ней значение serial_id.
Ну а теперь:
CREATE TABLE IF NOT EXISTS `tree` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`left_key` int(10) NOT NULL,
`right_key` int(10) NOT NULL,
`level` int(10) NOT NULL,
`serial_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `key` (`left_key`,`right_key`,`level`),
KEY `serial_id` (`serial_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Во- вторых, если посмотреть дамп, можно увидеть запись
INSERT INTO `tree` VALUES (1,'<root>',1,16,0,0),(8,'',14,15,1,27);
Обратите внимание на (1,'<root>',1,16,0,0), где serial_id = 0, что не может быть при добавлении FK
Удалите эту запись или исправьте в ней значение serial_id.
Ну а теперь:
ALTER TABLE `tree` ADD CONSTRAINT `tree_fk_1` FOREIGN KEY (`serial_id) REFERENCES `serials` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE;
Спустя 11 минут, 50 секунд (11.10.2011 - 16:24) RCuPeR написал(а):
Прошу прощения, при
возвращает ошибку
ALTER TABLE `tree` ADD CONSTRAINT `tree_fk_1` FOREIGN KEY (`serial_id) REFERENCES `serials` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE;
возвращает ошибку
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'serials` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE' at line 1
Спустя 3 минуты, 11 секунд (11.10.2011 - 16:27) h234 написал(а):
Кавычку пропустил у serial_id
ALTER TABLE `tree` ADD CONSTRAINT `tree_fk_1` FOREIGN KEY (`serial_id`) REFERENCES `serials` (`id` ) ON DELETE CASCADE ON UPDATE CASCADE;
Спустя 6 минут, 30 секунд (11.10.2011 - 16:33) RCuPeR написал(а):
Вроде бы получилось. Спасибо Вам.
Спустя 18 часов, 37 минут, 28 секунд (12.10.2011 - 11:11) RCuPeR написал(а):
Cannot add or update a child row: a foreign key constraint fails (`serial`.`tree`, CONSTRAINT `tree_sn` FOREIGN KEY (`season_id`) REFERENCES `seasons` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) [ INSERT INTO `tree` (`id`, `left_key`, `right_key`, `level`, `name`, `season_id`) VALUES (NULL, '52', 53, 1, 'Первый сезон', '16') ]
Помогите решить эту проблему ?
Спустя 37 минут, 5 секунд (12.10.2011 - 11:48) h234 написал(а):
season_id = 16 ,
в seasons.id (связанная таблица) есть такое значение то?
в seasons.id (связанная таблица) есть такое значение то?
Спустя 28 минут, 19 секунд (12.10.2011 - 12:16) RCuPeR написал(а):
Хм...Нет...Видимо неправильно связь сделал.
h234, можно Ваш скайп или аську ?
h234, можно Ваш скайп или аську ?
Спустя 10 минут, 16 секунд (12.10.2011 - 12:27) h234 написал(а):
если у вас поля tree.session_id и sessions.id связаны внешним ключом и ограничены как ON DELETE CASCADE ON UPDATE CASCADE, то в tree.session_id богут быть только значения из sessions.id
Спустя 23 минуты, 11 секунд (12.10.2011 - 12:50) RCuPeR написал(а):
Все, спасибо Вам еще раз. Сделал как нужно, получилось.
Может все таки поделитесь своими контактами для консультации ?
Может все таки поделитесь своими контактами для консультации ?
_____________
Гнусный социопат с комплексом Бога.