foreign key
— внешний ключ
— служит для сохранения ссылочной целостности БД.
Т.е. например, у нас в каждой строке таблицы
— факт начисления зарплаты кому-либо:
=== zarpl
dat date;
empl integer;
summa number;
здесь empl
— ссылка на работника, т.е. id (идентификатор) работника.
соответственно есть таблица с работниками:
=== empls
id integer;
fio char(50);
если построен внешний ключ с zarpl.empl на empls.id, то удаление работника, которому есть какие-то начисления, проходит «негладко».
Если внешний ключ построен с «каскадным удалением», то при удалении работника автоматически будут удаляться и все его начисления из zarpl.
Если внешний ключ
— «строгий», то при удалении работника, имеющего какие-либо начисления в zarpl, будет выдана ошибка.
Есть и другие варианты, не будем углубляться.
Грамотные проектировщики СУБД обязательно создают внешние ключи (если СУБД их поддерживает).
MySQL их поддерживает, например, для формата таблиц InnoDB.
Фактически, внешние ключи полностью отражают взаимоотношения между таблицами БД.
Именно на внешних ключах основаны алгоритмы работы средств, которые визуально отображают структуру БД. Потому что во внешних ключах
— ВСЁ.
Абсолютно логично выглядит идея, что в SQL-запросе таблицы связывать необязательно. Есть ведь внешние ключи... все связки и так ясны.
Однако, это не так.
Во-первых, в ANSI SQL никаких внешних ключей нет. Там вообще слишком мало есть
:)
Поэтому, все разработчики СУБД наворотили кто во что горазд, и с синтаксисом, и с возможностями.
Но в существовании ANSI SQL есть важный момент
— простой SQL-запрос, написанный для скажем dBase, будет полностью работоспособным и в MySQL, и в Oracle.
Но в dBase нет внешних ключей и быть не может.
Было бы нестратегично в одних СУБД автоматом включать все внешние ключи как связки в запрос, а в других СУБД
— не включать
:)
Во-вторых, одна таблица может входить в SQL-запрос несколько раз. И если связки расставляются автоматически, то что с чем связывать?...
Например, пусть в таблице с зарплатой есть ещё одно поле
— ссылка на бухгалтера по зарплате, который проводил начисление. Ясно, что это тоже ссылка на empls.
=== zarpl
dat date;
empl integer;
sum number;
buh integer;
Ну и пусть например есть внешние ключи
— zarpl.empl->empls.id, zarpl.buh->empls.id.
и вот мы пишем запросик:
select e.fio 'сотрудник', z.summa 'сумма', b.fio 'бухгалтер'
from zarpl z, empls e, empls b
where z.empl=e.id and z.buh=b.id
И как создать такие связки, имя информацию о внешних ключах?...
С чем связать z.empl? с таблицей "e" или с таблицей "b"?