[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL ключи
RCuPeR
Помогите связать 2 таблицы БД.
Нужно что бы при удалении записи из одной таблицы удалялось соответствие другой.


Таблица категорий:
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?
если да, то покажите ваш дамп:

mysqldump --databases имя_вашей_базы -u пользователь -p > /путь_куда_сохранить/dump.sql

Нет, не ставил индекс. Честно говоря, даже не знаю как это делается.

В аттаче дамп.

Спустя 4 минуты, 59 секунд (11.10.2011 - 15:41) alexbel2404 написал(а):
читай про триггеры.

Спустя 30 минут, 41 секунда (11.10.2011 - 16:12) h234 написал(а):
Во-первых `serial_id` выносим в отдельный index, а не в составной:

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 (связанная таблица) есть такое значение то?

Спустя 28 минут, 19 секунд (12.10.2011 - 12:16) RCuPeR написал(а):
Хм...Нет...Видимо неправильно связь сделал.

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 написал(а):
Все, спасибо Вам еще раз. Сделал как нужно, получилось.
Может все таки поделитесь своими контактами для консультации ?


_____________
Гнусный социопат с комплексом Бога.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.