Как сделать внешний ключ в базе данных

от admin

Как сделать внешний ключ в базе данных

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

Общий синтаксис установки внешнего ключа на уровне таблицы:

Для создания ограничения внешнего ключа после FOREIGN KEY указывается столбец таблицы, который будет представляет внешний ключ. А после ключевого слова REFERENCES указывается имя связанной таблицы, а затем в скобках имя связанного столбца, на который будет указывать внешний ключ. После выражения REFERENCES идут выражения ON DELETE и ON UPDATE , которые задают действие при удалении и обновлении строки из главной таблицы соответственно.

Например, определим две таблицы и свяжем их посредством внешнего ключа:

В данном случае определены таблицы Customers и Orders. Customers является главной и представляет клиента. Orders является зависимой и представляет заказ, сделанный клиентом. Таблица Orders через столбец CustomerId связана с таблицей Customers и ее столбцом Id. То есть столбец CustomerId является внешним ключом, который указывает на столбец Id из таблицы Customers.

С помощью оператора CONSTRAINT можно задать имя для ограничения внешнего ключа:

ON DELETE и ON UPDATE

С помощью выражений ON DELETE и ON UPDATE можно установить действия, которые выполняются соответственно при удалении и изменении связанной строки из главной таблицы. В качестве действия могут использоваться следующие опции:

CASCADE : автоматически удаляет или изменяет строки из зависимой таблицы при удалении или изменении связанных строк в главной таблице.

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

RESTRICT : отклоняет удаление или изменение строк в главной таблице при наличии связанных строк в зависимой таблице.

NO ACTION : то же самое, что и RESTRICT .

SET DEFAULT : при удалении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение по умолчанию, которое задается с помощью атрибуты DEFAULT. Несмотря на то, что данная опция в принципе доступна, однако движок InnoDB не поддерживает данное выражение.

Каскадное удаление

Каскадное удаление позволяет при удалении строки из главной таблицы автоматически удалить все связанные строки из зависимой таблицы. Для этого применяется опция CASCADE :

Подобным образом работает и выражение ON UPDATE CASCADE . При изменении значения первичного ключа автоматически изменится значение связанного с ним внешнего ключа. Однако поскольку первичные ключи изменяются очень редко, да и с принципе не рекомендуется использовать в качестве первичных ключей столбцы с изменяемыми значениями, то на практике выражение ON UPDATE используется редко.

Установка NULL

При установки для внешнего ключа опции SET NULL необходимо, чтобы столбец внешнего ключа допускал значение NULL:

MySQL 8.0.22 | How to create Foreign Key

Hi guys, so far it wasn’t that complicated, but from today it’s going to be slightly difficult. But once you get the basic concept of Foreign Key, you’ll be fine. Let’s get this started!

1. Why do we need Foreign Key?

Let’s say there’s a member information.

Here, ‘carNum’ means car plate number. You see there’s two people having one car each. There’s nothing wrong until ‘Nina’ gets another car. Some might think, “Easy, you can just put new tuple!”. But there’s a major problem of that idea.

Do you see what’s the problem? Right, since id is primary key(PK), there will be an error, if you put the tuple that has same value with another. The best way to do it is separating the table into two different tables.

Just like this. Now the only thing we need to know is how to connect these two tables. This is when we use the ‘Foreign Key’.

2. Create Foreign Key

It’s very easy to create Foreign Key. I’ll create the exact same tables with above. The name of the first table is member, and we can also call this original table as the ‘parent table’. Creating parent table is just same like creating normal ones.

Читать:
Как выстроить по алфавиту в excel

But here, the column which is going to be connected with the second table, has to be unique. So I put ‘primary key’ in id column. If you don’t know about unique and other constraints or key, take a look at my last posting down below!

MySQL 8.0.22 | Constraint and Key (Unique, Not Null, Default, Primary key)

Last time we had created tables and checked with select and where.

Next the second table which is named car, and you can call this table as the ‘child table’. We’re gonna connect parent an child table’s id column, and the query is just like below.

After write all the columns you need down, and then put , foreign key(childTable_column) references parentTable_name(parentTable-column) .
This is how you use foreign key.

Внешний ключ (FOREIGN KEY) в SQL

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

Здесь поле customer_id в таблице Orders является FOREIGN KEY , который ссылается на поле id в таблице Customers. Это означает, что значением customer_id (таблицы Orders) должно быть значение из столбца id (таблицы Customers).

Создание внешнего ключа

Теперь давайте посмотрим, как мы можем добавить ограничение FOREIGN KEY :

Здесь столбец customer_id таблицы Orders ссылается на столбец id таблицы Customers.

Примечание: Вышеприведенный код создания внешнего ключа может отличаться в некоторых СУБД.

Вставка данных в таблицу с внешним ключом

Попробуем вставить данные в таблицу с внешним ключом.

Зачем использовать внешний ключ?

Две главные причины:

Нормализация данных. FOREIGN KEY помогает нормализовать данные в нескольких таблицах и уменьшить избыточность. Это означает, что в базе данных может быть несколько таблиц, связанных друг с другом.

Предотвращение вставки некорректных данных. Если две таблицы в базе данных связаны через поле (атрибут), использование FOREIGN KEY гарантирует, что в это поле не будут вставлены неверные данные. Это помогает устранить ошибки на уровне базы данных.

FOREIGN KEY с оператором ALTER TABLE

Можно добавить ограничение FOREIGN KEY к существующей таблице с помощью оператора ALTER TABLE. Например:

How do I create a foreign key in SQL Server?

I have never «hand-coded» object creation code for SQL Server and foreign key decleration is seemingly different between SQL Server and Postgres. Here is my sql so far:

When I run the query I get this error:

Msg 8139, Level 16, State 0, Line 9 Number of referencing columns in foreign key differs from number of referenced columns, table ‘question_bank’.

Can you spot the error?

11 Answers 11

And if you just want to create the constraint on its own, you can use ALTER TABLE

I wouldn’t recommend the syntax mentioned by Sara Chipps for inline creation, just because I would rather name my own constraints.

Crab Bucket's user avatar

John Boker's user avatar

You can also name your foreign key constraint by using:

Brian Reichle's user avatar

I like AlexCuse’s answer, but something you should pay attention to whenever you add a foreign key constraint is how you want updates to the referenced column in a row of the referenced table to be treated, and especially how you want deletes of rows in the referenced table to be treated.

If a constraint is created like this:

.. then updates or deletes in the referenced table will blow up with an error if there is a corresponding row in the referencing table.

That might be the behaviour you want, but in my experience, it much more commonly isn’t.

If you instead create it like this:

..then updates and deletes in the parent table will result in updates and deletes of the corresponding rows in the referencing table.

(I’m not suggesting that the default should be changed, the default errs on the side of caution, which is good. I’m just saying it’s something that a person who is creating constaints should always pay attention to.)

Похожие статьи