Внешний ключ

редактировать

Проще говоря, внешний ключ - это набор атрибутов в таблице, которые относятся к первичному ключу другой стол. Внешний ключ связывает эти две таблицы. Другими словами: в контексте реляционных баз данных внешний ключ - это набор атрибутов, на которые распространяется определенный вид ограничений зависимости включения, в частности ограничение, которое кортежи, состоящие из внешних ключей атрибутов в одном отношении, R, также должны существовать в каком-то другом (не обязательно отдельном) отношении, S, и, кроме того, эти атрибуты должны также быть ключом-кандидатом в S. Проще говоря, внешний ключ - это набор атрибутов, который ссылается на ключ-кандидат. Например, таблица с именем TEAM может иметь атрибут MEMBER_NAME, который представляет собой внешний ключ, ссылающийся на ключ-кандидат PERSON_NAME в таблице PERSON. Так как MEMBER_NAME является внешним ключом, любое значение, существующее как имя члена в TEAM, должно также существовать как имя человека в таблице PERSON; другими словами, каждый член КОМАНДЫ также является ЧЕЛОВЕКОМ.

Содержание

  • 1 Сводка
  • 2 Ссылочные действия
    • 2.1 КАСКАД
    • 2.2 ОГРАНИЧЕНИЕ
    • 2.3 БЕЗ ДЕЙСТВИЙ
    • 2.4 УСТАНОВИТЬ ПО УМОЛЧАНИЮ, УСТАНОВИТЬ NULL
    • 2.5 Триггеры
  • 3 Пример
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

Сводка

Таблица, содержащая внешний ключ, называется дочерней таблицей, а таблица, содержащая ключ-кандидат, называется ссылочной или родительская таблица. В реляционном моделировании и реализации базы данных ключ-кандидат представляет собой набор из нуля или более атрибутов, значения которых гарантированно уникальны для каждого кортежа (строки) в отношении. Значение или комбинация значений ключевых атрибутов кандидата для любого кортежа не может быть дублирована для любого другого кортежа в этом отношении.

Поскольку цель внешнего ключа состоит в том, чтобы идентифицировать конкретную строку ссылочной таблицы, обычно требуется, чтобы внешний ключ был равен ключу-кандидату в некоторой строке первичной таблицы или не имел значения (значение NULL.). Это правило называется ограничением ссылочной целостности между двумя таблицами. Поскольку нарушения этих ограничений могут быть источником многих проблем с базами данных, большинство систем управления базами данных предоставляют механизмы, гарантирующие, что каждый ненулевой внешний ключ соответствует строке указанной таблицы.

Например, рассмотрим базу данных с двумя таблицами: таблица CUSTOMER, которая включает все данные о клиентах, и таблица ORDER, которая включает все заказы клиентов. Предположим, бизнес требует, чтобы каждый заказ относился к одному покупателю. Чтобы отразить это в базе данных, в таблицу ORDER добавляется столбец внешнего ключа (например, CUSTOMERID), который ссылается на первичный ключ CUSTOMER (например, ID). Поскольку первичный ключ таблицы должен быть уникальным, и поскольку CUSTOMERID содержит только значения из этого поля первичного ключа, мы можем предположить, что, когда он имеет значение, CUSTOMERID будет идентифицировать конкретного клиента, разместившего заказ. Однако этого больше нельзя предполагать, если таблица ORDER не обновляется при удалении строк таблицы CUSTOMER или изменении столбца ID, и работа с этими таблицами может стать более сложной. Многие базы данных реального мира обходят эту проблему путем «деактивации», а не физического удаления внешних ключей главной таблицы, или с помощью сложных программ обновления, которые изменяют все ссылки на внешний ключ, когда требуется изменение.

Внешние ключи играют важную роль в дизайне базы данных. Одна важная часть проектирования базы данных - убедиться, что отношения между реальными сущностями отражаются в базе данных ссылками, используя внешние ключи для ссылки из одной таблицы в другую. Другой важной частью проектирования базы данных является нормализация базы данных, при которой таблицы разбиваются на части, а внешние ключи позволяют их реконструировать.

Несколько строк в ссылающейся (или дочерней) таблице может относиться к той же строке в указанной (или родительской) таблице. В этом случае связь между двумя таблицами называется отношением один ко многим между таблицей, на которую указывает ссылка, и таблицей, на которую указывает ссылка.

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

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

Внешний ключ определяется как атрибут или набор атрибутов в отношении, значение которых соответствует первичному ключу в другом отношении. ограничение. Синтаксис для добавления такого ограничения к существующей таблице определен в SQL: 2003, как показано ниже. Отсутствие списка столбцов в предложении REFERENCES подразумевает, что внешний ключ должен ссылаться на первичный ключ указанной таблицы. Точно так же внешние ключи могут быть определены как часть SQL-оператора CREATE TABLE.

CREATE TABLE table_name (id INTEGER PRIMARY KEY, col2 CHARACTER VARYING (20), col3 INTEGER,... FOREIGN KEY (col3) REFERENCES other_table (key_col) ON DELETE CASCADE,...)

Если внешний ключ только один столбец, столбец может быть помечен как таковой, используя следующий синтаксис:

ALTER TABLE ADD [CONSTRAINT ] FOREIGN KEY ({, }...) ССЫЛКИ 
[({, }...)] [ON UPDATE ] [ON DELETE ]

Внешние ключи могут быть определены с помощью оператора хранимой процедуры.

sp_foreignkey tabname, pktabname, col1 [, col2]... [, col8]
CREATE TABLE table_name (id INTEGER PRIMARY KEY, col2 CHARACTER VARYING (20), col3 INTEGER REFERENCES other_table (column_name),...)
  • tabname : имя таблицы или представления, которое содержит внешний ключ, который должен быть определен.
  • pktabname : имя таблицы или представления, имеющего первичный ключ, к которому применяется внешний ключ. Первичный ключ уже должен быть определен.
  • col1 : имя первого столбца, составляющего внешний ключ. Внешний ключ должен иметь как минимум один столбец и максимум восемь столбцов.

Ссылочные действия

Поскольку система управления базами данных применяет ссылочные ограничения, она должна гарантировать целостность данных, если строки в ссылочной таблице должны быть удалены (или обновлены). Если зависимые строки в ссылочных таблицах все еще существуют, эти ссылки необходимо учитывать. SQL: 2003 определяет 5 различных ссылочных действий, которые должны иметь место в таких случаях:

  • CASCADE
  • RESTRICT
  • NO ACTION
  • SET NULL
  • SET DEFAULT

CASCADE

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

RESTRICT

Значение не может быть обновлено или удалено, если в ссылочной или дочерней таблице существует строка, которая ссылается на значение в ссылочной таблице.

Точно так же нельзя удалить строку, пока на нее есть ссылка из ссылающейся или дочерней таблицы.

Чтобы лучше понять RESTRICT (и CASCADE), может быть полезно заметить следующее различие, которое может быть не сразу понятно. Ссылочное действие CASCADE изменяет «поведение» самой (дочерней) таблицы, в которой используется слово CASCADE. Например, ON DELETE CASCADE эффективно говорит: «Когда указанная строка удаляется из другой таблицы (главной таблицы), то удалить также и из меня». Однако ссылочное действие RESTRICT изменяет "поведение" главной таблицы, а не дочерней таблицы, хотя слово RESTRICT появляется в дочерней таблице, а не в главной таблице! Итак, ON DELETE RESTRICT эффективно говорит: «Когда кто-то пытается удалить строку из другой таблицы (главной таблицы), предотвращайте удаление из этой другой таблицы (и, конечно, также не удаляйте из меня, но это не главное. Вот)."

RESTRICT не поддерживается в Microsoft SQL 2012 и более ранних версиях.

БЕЗ ДЕЙСТВИЙ

БЕЗ ДЕЙСТВИЙ и ОГРАНИЧЕНИЕ очень похожи. Основное различие между NO ACTION и RESTRICT заключается в том, что при NO ACTION проверка ссылочной целостности выполняется после попытки изменить таблицу. RESTRICT выполняет проверку перед попыткой выполнить инструкцию UPDATE или DELETE. Оба ссылочных действия действуют одинаково, если проверка ссылочной целостности не удалась: оператор UPDATE или DELETE приведет к ошибке.

Другими словами, когда оператор UPDATE или DELETE выполняется для указанной таблицы с использованием ссылочного действия NO ACTION, СУБД проверяет в конце выполнения оператора, что ни одно из ссылочных отношений не нарушено. Это отличается от RESTRICT, который изначально предполагает, что операция нарушит ограничение. При использовании NO ACTION триггеры или семантика самого оператора могут привести к конечному состоянию, в котором никакие отношения внешних ключей не нарушаются к моменту окончательной проверки ограничения, что позволяет успешно завершить выполнение инструкции.

SET DEFAULT, SET NULL

В общем, действия, предпринимаемые СУБД для SET NULL или SET DEFAULT, одинаковы как для ON DELETE, так и для ON UPDATE: значение затронутых ссылочных атрибутов изменяется на NULL для SET NULL и на указанное значение по умолчанию для SET DEFAULT.

Триггеры

Ссылочные действия обычно реализуются как подразумеваемые триггеры (т. Е. Триггеры с именами, сгенерированными системой, часто скрытыми). Таким образом, на них распространяются те же ограничения. как определяемые пользователем триггеры, и может потребоваться рассмотреть их порядок выполнения относительно других триггеров; в некоторых случаях может возникнуть необходимость заменить ссылочное действие его эквивалентным определяемым пользователем триггером, чтобы обеспечить надлежащий порядок выполнения или обойти ограничения изменяемой таблицы.

Другое важное ограничение появляется с изоляцией транзакции : ваши изменения в строке могут быть не в состоянии полностью каскадно, потому что на эту строку ссылаются данные, которые ваша транзакция не может «видеть», и, следовательно, не может каскадироваться на. Пример: пока ваша транзакция пытается изменить нумерацию учетной записи клиента, одновременная транзакция пытается создать новый счет для того же клиента; хотя правило CASCADE может исправить все строки счета-фактуры, которые может видеть ваша транзакция, чтобы они соответствовали перенумерованной строке клиента, оно не будет затрагивать другую транзакцию, чтобы исправить там данные; поскольку база данных не может гарантировать согласованность данных, когда две транзакции фиксируются, одна из них будет вынуждена откатиться (часто в порядке очереди.)

CREATE TABLE account (acct_num INT, amount DECIMAL (10, 2)); СОЗДАТЬ ТРИГГЕР ins_sum ПЕРЕД ВСТАВКОЙ НА УЧЕТКУ ДЛЯ КАЖДОЙ СТРОКИ НАБОР @sum = @sum + NEW.amount;

Пример

В качестве первого примера для иллюстрации внешних ключей предположим, что в базе данных учетных записей есть таблица со счетами-фактурами, и каждый счет-фактура связан с конкретным поставщиком. Детали поставщика (например, имя и адрес) хранятся в отдельной таблице; каждому поставщику дается «номер поставщика» для его идентификации. Каждая запись счета-фактуры имеет атрибут, содержащий номер поставщика для этого счета-фактуры. Тогда «номер поставщика» является первичным ключом в таблице «Поставщик». Внешний ключ в таблице Invoices указывает на этот первичный ключ. Реляционная схема следующая. Первичные ключи выделены жирным шрифтом, а внешние ключи - курсивом.

Поставщик (SupplierNumber, имя, адрес, тип) Счета-фактуры (InvoiceNumber, SupplierNumber, текст)

Соответствующий язык определения данных заявление выглядит следующим образом.

CREATE TABLE Supplier (SupplierNumber INTEGER NOT NULL, имя VARCHAR (20) NOT NULL, адрес VARCHAR (50) NOT NULL, тип VARCHAR (10), CONSTRAINT supplier_pk PRIMARY KEY (SupplierNumber), CONSTRAINT number_value CHECK (SupplierNumber>0)) СОЗДАТЬ ТАБЛИЦУ счетов-фактур (InvoiceNumber INTEGER NOT NULL, SupplierNumber INTEGER NOT NULL, текст VARCHAR (4096), CONSTRAINT invoice_pk PRIMARY KEY (InvoiceNumber), CONSTRAINT inumber_value CHECK (SupplierNumber>0), REFEENCEY поставщик) (поставщик FORSTRAINTESIGN) ON UPDATE CASCADE ON DELETE RESTRICT)

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-20 11:14:50
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru