Създавам база данни с помощта на phpMyAdmin. Имам две таблици (foo
и bar
), индексирани по техните първични ключове. Опитвам се да създам релационна таблица (foo_bar
) между тях, като използвам техните първични ключове като външни ключове.
Създадох тези таблици като MyISAM, но след това промених и трите на InnoDB, защото прочетох, че MyISAM не поддържа чужди ключове. Всички полета id
са INT(11)
.
Когато избера таблицата foo_bar
, щракна върху връзката "relation view" и се опитам да задам колоните с FK да бъдат database.foo.id
и database.bar.id
, до всяка колона се изписва "No index defined!".
Какво пропускам?
С цел опростяване искам да продължа да използвам phpMyAdmin. В момента използвам XAMPP, който е достатъчно лесен, за да ми позволи да се съсредоточа върху PHP/CSS/Javascript, и идва с phpMyAdmin.
Освен това, въпреки че все още не съм успял да настроя явни чужди ключове, имам релационна таблица и мога да извършвам подобни обединения:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
Просто ми е неудобно да нямам изрично дефинирани външни ключове в базата данни.
Ако искате да използвате phpMyAdmin, за да настроите отношенията, трябва да направите 2 неща. Първо, трябва да дефинирате индекс на колоната с чужд ключ в таблицата, към която се отнасяте (във вашия случай foo_bar.foo_id). След това отидете в изгледа на връзката (в препращащата таблица) и изберете препращащата колона (така че във вашия случай foo.id) и действията on update и on delete.
Мисля, че чуждите ключове са полезни, ако имате няколко таблици, свързани помежду си, по-специално скриптовете ви за изтриване ще станат много кратки, ако настроите правилно опциите за препращане.
EDIT: Уверете се, че и за двете таблици е избран двигател InnoDB.
phpMyAdmin ви позволява да дефинирате чужди ключове чрез изгледа "relations". Но тъй като MySQL поддържа чужди ограничения само за "INNO DB" таблици, първата стъпка е да се уверите, че таблиците, които използвате, са от този тип.
За да настроите чужд ключ, така че колоната PID в таблица с име CHILD да препраща към колоната ID в таблица с име PARENT, можете да направите следното:
Извършвайки експорт на таблицата CHILD, трябва да видите, че е създадено ограничение на чужд ключ за колоната PID.
InnoDB ви позволява да добавите ново ограничение за чужд ключ към таблица с помощта на ALTER TABLE:
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
От друга страна, ако MyISAM има предимства пред InnoDB във вашия контекст, защо изобщо бихте искали да създавате ограничения за чужди ключове. Можете да се справите с това на ниво модел на вашето приложение. Просто се уверете, че колоните, които искате да използвате като чужди ключове, са индексирани!