noder_ss
@noder_ss
Линуксоид-энтузиаст и SQL разработчик

Как можно использовать Foreign Key?

При изучении SQL возник вопрос, как можно использовать foreign key? Везде пишут, что это когда одна таблица ссылается на другую, как это понять и вообще использовать в каких либо проектах? Кто может объяснить структуру написания с использованием foreign key, references и constraint?
  • Вопрос задан
  • 1254 просмотра
Решения вопроса 3
Очевидный пример:
Допустим у тебя есть таблица с домашними животными и таблица с хозяевами домашних животных.

Чтобы указать у животного, кто его владелец - ты заводишь колонку "идентификатор владельца".

И вот чтобы гарантировать, что эта колонка всегда содержит реально существующий идентификатор, и что, например, никто не удалит владельца, к которому привязаны какие-то животные - ты можешь завести foreign key.

В случае попытки удалить запись о владельце, на которого кто-то ещё ссылается, или при попытке указать несуществующий ИД - СУБД выдаст ошибку, что было нарушено ограничение.
Ответ написан
TMProject
@TMProject
Frontend developer React/Redux
Foreign key (внешний ключ) - это механизм, который позволяет связывать данные из двух таблиц в базе данных, где одна таблица ссылается на другую посредством поля, которое является первичным ключом в таблице, на которую она ссылается.

Использование foreign key имеет несколько преимуществ. Одно из них - обеспечение целостности данных, то есть предотвращение появления некорректных значений в таблице. Когда вы устанавливаете foreign key, вы создаете ограничение, которое не позволит вставить запись в таблицу, если нет соответствующего значения в связанной таблице.

Чтобы создать foreign key, вы должны выполнить следующие шаги:
  1. Создайте таблицу, которая будет ссылаться на другую таблицу:
    CREATE TABLE table1 (
        id INT PRIMARY KEY,
        name VARCHAR(50),
        table2_id INT,
        FOREIGN KEY (table2_id) REFERENCES table2(id)
    );


  2. Создайте таблицу, на которую будет ссылаться первая таблица:
    CREATE TABLE table2 (
        id INT PRIMARY KEY,
        name VARCHAR(50)
    );


  3. Установите связь между таблицами с помощью ключевого слова REFERENCES:
    FOREIGN KEY (table2_id) REFERENCES table2(id)


В этом примере, мы создаем таблицу table1, которая имеет поле table2_id, которое ссылается на поле id в таблице table2. С помощью ключевого слова FOREIGN KEY мы говорим базе данных, что это поле должно быть связано с полем id в таблице table2.

Также мы можем добавить ограничение ON DELETE, чтобы определить, что происходит с записями в таблице, которые связаны с удаленными записями из другой таблицы. Например:
FOREIGN KEY (table2_id) REFERENCES table2(id) ON DELETE CASCADE

В этом примере, мы указываем, что при удалении записи из таблицы table2, все связанные записи в таблице table1 также должны быть удалены (CASCADE).

Таким образом, использование foreign key может значительно улучшить целостность данных в вашей базе данных, облегчить ее обслуживание и предотвратить появление ошибок в будущем.
Ответ написан
Комментировать
@Akina
Сетевой и системный админ, SQL-программист.
Запомните одну вещь. Многие её забывают или не знают, и из этого проистекают все их проблемы.

Внешний ключ (FOREIGN KEY) - это ПРАВИЛО. Всё остальное - либо дополнения, либо следствия. Народ начинает рассказывать про индексы и прочее - НЕТ! Не включайте всё это в определение собственно внешнего ключа.

Хотя оно хранится в структуре таблицы, оно является не частью структуры таблицы, а инструкцией, которая будет обрабатываться подсистемой контроля целостности и непротиворечивости данных - есть такая в составе SQL-сервера.

Это правило устанавливает, что при добавлении/изменении значения следует проверить существование нового значения в ссылочной таблице. И наоборот - при удалении следует проверить отсутствие удаляемого значения в ссылающейся таблице. То есть правило работает в обе стороны - влияет не только на таблицу, в которой оно определено, но и на упомянутую в правиле таблицу, при этом в структуре ссылочной таблицы никакого упоминания о существовании этого правила нет. Но, поскольку подсистема контроля - это подсистема уровня сервера, то ей плевать, где прописано.

Это правило может быть дополнено опциями каскадной операции ON DELETE/UPDATE - в этом случае после контроля нового значения подсистема даёт дополнительную команду на выполнение указанных в опции изменений зависящих данных.

Впрочем, создание внешнего ключа может и приводить к изменению структуры. Но не той таблицы, в которой создаётся внешний ключ, а в той, на которую этот ключ ссылается. дело в том, что для эффективной работы подсистемы контроля в ссылающейся таблице должен существовать индекс, который может и будет использоваться для эффективного контроля. То есть либо выражение внешнего ключа должно совпадать с выражением индекса, либо быть его префиксом. Некоторые СУБД при отсутствии такого индекса создают его автоматически, некоторые завершают попытку создания с ошибкой.

Также создание внешнего ключа приводит к выполнению дополнительного контроля такого индекса поддержки, если он удаляется. Если нет другого индекса, который может использоваться для поддержки, то операция удаления индекса будет заблокирована.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы