Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > FK, уместно ли использовать


Автор: triclosan 7.8.2008, 15:41
Имеется база, содержащая 8 таблиц с 6 связями между ними. Если не планируется редактировать родительские айди и удалять родительские записи этих связей, есть ли смысл создавать для них внешние ключи? Ранее FK не использовал и связывал таблицы вручную исключительно на уровне запросов. Cоздал внешние ключи и столкнулся с рядом sql ошибок - последовательности создания таблиц и внесения в них данных. Или может быть я недооцениваю мощь FK  smile ?

Автор: lnick 3.10.2008, 12:10
Ну как сказать. В общем МУСКУЛУ ФК не нужны. Он не контролирует достоверноть ввода данных по ключевым полям. Тоесть. Если ты вводишь в главную таблицу данные, которые нет в подчиненной, он проглотит и даже не выведет ошибки. Для этого необходимо писать триггеры, которые контролируют все это. 

Другое дело. если те нужно каскадное обновление и удаление, тогда ФК нужны. В типе Inodb есть такая функция. 


Автор: skyboy 3.10.2008, 13:16
Цитата(lnick @  3.10.2008,  11:10 Найти цитируемый пост)
Если ты вводишь в главную таблицу данные, которые нет в подчиненной, он проглотит и даже не выведет ошибки. 

если под подчиненный понимается таблица, которая имеет внешний ключ на главную, то все правильно: если добавляешь покупателя(пример), то он не обязан(да, и не может) уже иметь имеющиеся заказы.
если же под подчиненной понимается таблица, на которую ссылаются и смысл фразы в том, что mysql не реализует проверку ссылочной целостности при вставке, то попробуй сделать следующее:
Код

create table source(
id int auto_increment primary key,
`name` varchar(32) 
) engine = innodb;

create table target(
id int auto_increment primary key,
source_id int,
`name` varchar(32),
FOREIGN KEY (source_id) REFERENCES source(id)
                      ON DELETE CASCADE

) engine = innodb;

insert into target(source_id, `name`) values(11, 'ffff');

лично я под управление сервера версией 5.1 получаю
Цитата

Error Code : 1216
Cannot add or update a child row: a foreign key constraint fails

хочу отдельно отметить, что обе связанные таблицы должны иметь тип innoDB

Автор: lnick 3.10.2008, 14:24
Ну да. Именно это я и имел ввиду. Только пример не приводил.

Автор: skyboy 3.10.2008, 15:17
lnick, а как же твои слова:
Цитата(lnick @  3.10.2008,  11:10 Найти цитируемый пост)
Он не контролирует достоверноть ввода данных по ключевым полям. 
? ведь таки контролирует!


Автор: lnick 3.10.2008, 16:41
В InnoDB да, а в MyISAM нет.

Автор: triclosan 5.10.2008, 20:44
Цитата(lnick @  3.10.2008,  16:41 Найти цитируемый пост)
В InnoDB да, а в MyISAM нет. 


И не только достоверность ввода, а как я понимаю события ON UPDATE и ON DELETE в MyISAM не будут срабатывать. 

В 6-ке хотят сделать поддержку FK и транзакций для MyISAM  чтобы путаницы не было  smile  

Автор: lnick 6.10.2008, 15:23
Ну да. MyISAM немного ограничен и малофункционален. Тоже жду 6. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)