Как сделать внешний ключ в базе данных
Перейти к содержимому

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

  • автор:

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

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

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

[CONSTRAINT имя_ограничения] FOREIGN KEY (столбец1, столбец2, . столбецN) REFERENCES главная_таблица (столбец_главной_таблицы1, столбец_главной_таблицы2, . столбец_главной_таблицыN) [ON DELETE действие] [ON UPDATE действие]

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

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

CREATE TABLE Customers ( Id INT PRIMARY KEY AUTO_INCREMENT, Age INT, FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL, Phone VARCHAR(20) NOT NULL UNIQUE ); CREATE TABLE Orders ( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Customers (Id) );

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

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

CREATE TABLE Orders ( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, CONSTRAINT orders_custonmers_fk FOREIGN KEY (CustomerId) REFERENCES Customers (Id) );

ON DELETE и ON UPDATE

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

  • CASCADE : автоматически удаляет или изменяет строки из зависимой таблицы при удалении или изменении связанных строк в главной таблице.
  • SET NULL : при удалении или обновлении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение NULL . (В этом случае столбец внешнего ключа должен поддерживать установку NULL)
  • RESTRICT : отклоняет удаление или изменение строк в главной таблице при наличии связанных строк в зависимой таблице.
  • NO ACTION : то же самое, что и RESTRICT .
  • SET DEFAULT : при удалении связанной строки из главной таблицы устанавливает для столбца внешнего ключа значение по умолчанию, которое задается с помощью атрибуты DEFAULT. Несмотря на то, что данная опция в принципе доступна, однако движок InnoDB не поддерживает данное выражение.

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

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

CREATE TABLE Orders ( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE CASCADE );

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

Установка NULL

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

CREATE TABLE Orders ( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE SET NULL );

Создание связей по внешнему ключу

В этой статье описывается создание связей внешнего ключа в SQL Server с помощью SQL Server Management Studio или Transact-SQL. Связь создается между двумя таблицами, чтобы связать строки одной таблицы со строками другой.

Разрешения

Создание новой таблицы с внешним ключом требует разрешения CREATE TABLE в базе данных и разрешения ALTER на схему, в которой создается таблица.

Создание внешнего ключа в существующей таблице требует разрешения ALTER на таблицу.

Ограничения и ограничения

  • Ограничение внешнего ключа не обязательно должно быть связано только с ограничением первичного ключа в другой таблице. Внешние ключи также могут быть определены, чтобы ссылаться на столбцы ограничения UNIQUE в другой таблице.
  • Если столбцу, имеющему ограничение внешнего ключа, задается значение, отличное от NULL, такое же значение должно существовать и в указываемом столбце. В противном случае будет возвращено сообщение о нарушении внешнего ключа. Для обеспечения проверки всех значений сложного ограничения внешнего ключа задайте параметр NOT NULL для всех столбцов, участвующих в индексе.
  • Ограничения FOREIGN KEY могут ссылаться только на таблицы в пределах той же базы данных на том же сервере. Межбазовую ссылочную целостность необходимо реализовать посредством триггеров. Дополнительные сведения см. в статье об инструкции CREATE TRIGGER.
  • Ограничения FOREIGN KEY могут ссылаться на другие столбцы той же таблицы и считаются ссылками на себя.
  • Ограничение FOREIGN KEY, определенное на уровне столбцов, может содержать только один ссылочный столбец. Этот столбец должен принадлежать к тому же типу данных, что и столбец, для которого определяется ограничение.
  • Ограничение FOREIGN KEY, определенное на уровне таблицы, должно содержать такое же число ссылочных столбцов, какое содержится в списке столбцов в ограничении. Тип данных каждого ссылочного столбца должен также совпадать с типом соответствующего столбца в списке столбцов.
  • Ядро СУБД не имеет предопределенного ограничения на количество ограничений FOREIGN KEY, которые могут содержать ссылки на другие таблицы. Ядро СУБД также не ограничивает количество ограничений FOREIGN KEY, принадлежащих другим таблицам, ссылающимся на определенную таблицу. Но фактическое количество используемых ограничений FOREIGN KEY ограничивается конфигурацией оборудования, базы данных и приложения. Максимальное количество таблиц и столбцов, на которые может ссылаться таблица в качестве внешних ключей (исходящих ссылок), равно 253. SQL Server 2016 (13.x) и более поздних версий увеличивает ограничение числа других таблиц и столбцов, которые могут ссылаться на столбцы в одной таблице (входящей ссылки) с 253 до 10 000. (Требуется уровень совместимости не менее 130.) Увеличение имеет следующие ограничения:
    • Превышение 253 ссылок на внешние ключи поддерживается только для операций DELETE и UPDATE DML. Операции MERGE не поддерживаются.
    • Таблица со ссылкой внешнего ключа на саму себя по-прежнему ограничена 253 ссылками на внешние ключи.
    • Превышение числа в 253 ссылки на внешние ключи в настоящее время недоступно для индексов columnstore, оптимизированных для памяти таблиц или Stretch Database.

    Stretch Database устарел в SQL Server 2022 (16.x) и База данных SQL Azure. Эта функция будет удалена в будущей версии ядро СУБД. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

    Создание связи по внешнему ключу в конструкторе таблиц

    Использование SQL Server Management Studio

    1. В обозревателе объектов щелкните правой кнопкой мыши таблицу, которая будет содержать внешний ключ для связи, и выберите пункт Конструктор. Таблица откроется в окне Конструктор таблиц.
    2. В меню конструктора таблиц выберите Связи. (См. меню Конструктор таблиц в заголовке или щелкните правой кнопкой мыши пустое место определения таблицы и выберите Связи.)
    3. В диалоговом окне Связи внешнего ключа нажмите кнопку Добавить. Связь отображается в списке выбранных связей с именем, предоставленным системой, в формате FK_tablename_ >, где имя первой таблицы — имя внешней таблицы ключей, а второе имя таблицы — имя таблицы первичного ключа. Это просто принятое по умолчанию и распространенное соглашение об именах для поля (Name) объекта внешнего ключа.
    4. Выберите нужную связь в списке Выбранные связи.
    5. Выберите Спецификация таблиц и столбцов в сетке справа и нажмите кнопку с многоточием () справа от свойства.
    6. В диалоговом окне Таблицы и столбы в раскрывающемся списке Первичный ключ выберите таблицу, которая будет находиться на стороне первичного ключа связи.
    7. В сетке внизу выберите столбцы, составляющие первичный ключ таблицы. В соседней ячейке сетки справа от каждого столбца выберите соответствующий столбец внешнего ключа таблицы внешнего ключа. Конструктор таблиц автоматически предлагает имя для связи. Чтобы его изменить, отредактируйте содержимое текстового поля Имя связи .
    8. Нажмите кнопку , чтобы создать связь.
    9. Закройте окно конструктора таблиц и сохраните внесенные изменения, чтобы изменения связи внешнего ключа вступили в силу.

    Создание внешнего ключа в новой таблице

    Использование Transact-SQL

    В следующем примере создается таблица и определяется ограничение внешнего ключа для столбца TempID , ссылающегося на столбец SalesReasonID в таблице Sales.SalesReason базы данных AdventureWorks . Предложения ON DELETE CASCADE и ON UPDATE CASCADE используются для обеспечения распространения изменений, вносимых в таблицу Sales.SalesReason на таблицу Sales.TempSalesReason .

    CREATE TABLE Sales.TempSalesReason ( TempID int NOT NULL, Name nvarchar(50) , CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID) , CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ) ; 

    Создание внешнего ключа в существующей таблице

    Использование Transact-SQL

    В следующем примере создается внешний ключ для столбца TempID , ссылающегося на столбец SalesReasonID в таблице Sales.SalesReason базы данных AdventureWorks .

    ALTER TABLE Sales.TempSalesReason ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) REFERENCES Sales.SalesReason (SalesReasonID) ON DELETE CASCADE ON UPDATE CASCADE ; 

    Следующие шаги

    • Ограничения первичных и внешних ключей
    • GRANT (разрешения на базу данных)
    • ALTER TABLE
    • CREATE TABLE
    • ALTER TABLE table_constraint.

    Как создать первичные и внешние ключи MySQL

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

    Эта инструкция — часть курса «MySQL для новичков».

    Смотреть весь курс

    Введение

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

    Облачные базы данных

    Что такое первичный и внешний ключи и зачем они нужны

    Начнем рассмотрение данного вопроса с двух самых главных элементов: первичного и внешнего ключей.

    Первичный ключ или primary key

    Первичный ключ — особенное поле в SQL-таблице, которое позволяет однозначно идентифицировать каждую запись в ней. Как правило, эти поля используются для хранения уникальных идентификаторов объектов, которые перечислены в таблице, например, это может быть ID клиента или товара.
    Первичный ключ имеет несколько свойств:

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

    Внешний ключ или foreign key

    Внешний ключ нужен для того, чтобы связать две разные SQL-таблицы между собой. Внешний ключ таблицы должен соответствует значению первичного ключа таблицы, с которой он связан. Это помогает сохранять согласованность базы данных путем обеспечения так называемой «ссылочной целостности» (referential integrity).

    Давайте рассмотрим все это на примере простой базы данных. Для начала нам понадобится создать базу данных. Заходим в MySQL и создаем базу данных, в которой будут храниться записи о книгах в библиотеке:

    create database slcbookshelf; 

    пример БД

    Так как дальше мы будем работать с этой базой, вводим команду:

    use slcbookshelf; 

    И создаем таблицу, в которой будут храниться записи о книгах в библиотеке:

    CREATE TABLE books ( book_id INT NOT NULL, book_name VARCHAR(255) NOT NULL, book_category VARCHAR(255)); 

    Создание первичного ключа при создании таблицы и с помощью ALTER TABLE

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

    DESC books; 

    Вывод команды будет выглядеть следующим образом:

    mysql> DESC books; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | book_id | int | NO | | NULL | | | book_name | varchar(255) | NO | | NULL | | | book_category | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 

    Первичный ключ при создании таблицы

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

    PRIMARY KEY (book_id) 

    В таком случае поле book_id после создания таблицы будет являться первичным ключом для таблицы books.

    Создание первичного ключа при помощи ALTER TABLE

    Если таблица уже создана, а первичный ключ в ней не указан, вы можете создать ключевое поле, с помощью команды ALTER TABLE. Команда ALTER TABLE помогает изменять уже существующие столбцы, удалять их или добавлять новые. Чтобы определить первичный ключ в поле book_id, выполните команду:

    ALTER TABLE books ADD PRIMARY KEY (book_id); Проверяем: mysql> DESC books; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | book_id | int | NO | PRI | NULL | | | book_name | varchar(255) | NO | | NULL | | | book_category | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 

    Установка внешнего ключа MySQL при создании таблицы и с помощью ALTER TABLE

    Предположим, у нас есть еще одна таблица под названием authors, которую нам необходимо связать с текущей таблицей books с помощью внешнего ключа author_id.

    Внешний ключ при создании таблицы

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

    FOREIGN KEY (author_id) REFERENCES authors(author_id) 

    В итоге запрос, которым создается такая таблица будет выглядеть следующим образом:

    CREATE TABLE books ( book_id INT NOT NULL, book_name VARCHAR(255) NOT NULL, book_category VARCHAR(255), FOREIGN KEY (author_id) REFERENCES authors(author_id)); 

    Создание внешнего ключа при помощи ALTER TABLE

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

    ALTER TABLE books ADD FOREIGN KEY (author_id) REFERENCES authors(author_id); 

    Сценарии использования внешнего ключа

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

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

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

    CREATE TABLE Orders( Id INT PRIMARY KEY AUTO_INCREMENT, CustomerId INT, CreatedAt Date, FOREIGN KEY (CustomerId) REFERENCES Customers (Id) ON DELETE CASCADE); 

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

    RESTRICT

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

    CREATE TABLE Orders( Id INT PRIMARY KEY AUTO_INCREMENT, Customer_Id INT, CreatedAt Date, FOREIGN KEY (Customer_Id) REFERENCES Customers (Id) ON DELETE RESTRICT); 

    Заключение

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

    Как установить и использовать MySQL Workbench

    Ключи в базе данных: практический обзор для начинающих системных аналитиков

    Всем привет! Меня зовут Оксана, я системный аналитик из компании EvApps. Что побудило меня написать эту статью? Я обучаю стажеров – системных аналитиков, и недавно столкнулась с такими вопросами, о которых раньше даже не задумывалась.

    Вопросы были связаны с разными видами ключей в базе данных и с тем, как они связаны между собой (тему с реляционными БД мы разбираем на примере PostgreSQL). Я начала искать разные статьи по этой теме, очень много крутого материала на том же «Хабре», но многие вопросы так и остались не раскрытыми. И мне стало интересно разобраться с этими вопросами и «пощупать» все это на практике. В итоге начала изучать документацию PostgreSQL и теорию реляционных баз данных, но чтобы получить ответы, пришлось все проверять на практических примерах.

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

    • ограничение уникальности;
    • первичные ключи;
    • внешние ключи.

    Кому может быть полезна данная статья? Начинающим системным аналитикам и всем, у кого возникали подобные вопросы.

    1. Можно ли создать таблицу без первичного ключа?

    Да, можно. И технически это получится сделать. Но! Согласно теории баз данных, каждая таблица должна иметь первичный ключ. И в документации постгре также на это ссылаются.

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

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

    CREATE TABLE public.user ( id int, "name" varchar, age int );

    Далее хочу создать таблицу Order и связать ее с таблицей User. И при выполнении запроса получаю ошибку.

    2. Можно ли использовать ограничение уникальности вместо первичного? В чём особенности?

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

    Вариант с использованием UNIQUE:

    CREATE TABLE public.user1 ( id int UNIQUE, "name" varchar, age int );

    Вариант с использованием PRIMARY KEY:

    CREATE TABLE public.user2 ( id int PRIMARY KEY, "name" varchar, age int );

    Теперь попробуем создать запись в таблице user1, но для id установим значение null:

    INSERT INTO public.user1 (id, "name", age) VALUES(null, 'Иван', 10); select * from public.user1

    Как видим, запись в таблицу добавилась успешно.

    Теперь попробуем то же самое сделать в таблице user2:

    INSERT INTO public.user2 (id, "name", age) VALUES(null, 'Иван', 10); 

    И видим, что при создании записи возникает ошибка.

    Какие выводы можно сделать:

    • PRIMARY KEY – первичный ключ, позволяет сделать запись уникальной и включает в себя ограничение NOT NULL.
    • UNIQUE – ограничение уникальности, обеспечивает уникальность значений в столбце/столбцах, при этом не имеет проверку на NULL. Чтобы этого избежать, нужно использовать UNIQUE NOT NULL.

    По факту, вместо PRIMARY KEY можно использовать UNIQUE NOT NULL и Postgres позволяет это сделать, но рекомендуют следовать теории реляционных баз данных и устанавливать первичные ключи.

    3. Можно ли использовать первичный ключ и ограничение уникальности вместе (т. е. для одного столбца установить два ограничения)?

    Да, можно, но это бессмысленно. В данном случае учитывается ограничение первичного ключа, а UNIQUE считается избыточным и отбрасывается.

    Например, я создаю таблицу:

    CREATE TABLE public.user3 ( id int PRIMARY KEY UNIQUE, "name" varchar, age int );

    Но в DDL можем увидеть, что в ограничениях остался только первичный ключ.

    При этом можно использовать и первичный ключ и ограничение уникальности в рамках одной таблицы.

    4. Можно ли сделать связь с ограничением уникальности?

    Создаем таблицу, где установлено ограничение уникальности:

    CREATE TABLE public.user1 ( id int UNIQUE, "name" varchar, age int );

    Далее создаем таблицу с ссылкой на таблицу user1:

    CREATE TABLE public.order ( id int, order_number varchar, user_id int references public.user1(id), sum float );

    Таблица создана успешно, связь настроена.

    И если мы попытаемся в таблицу Order добавить запись с пользователем, которого нет в таблице user1, то получим ошибку.

    Можно ли установить связь между таблицами без внешнего ключа?

    Нет, это невозможно. Для установления связи между таблицами обязательно использование REFERENCES.

    Примечание:
    Технически можно условно связать таблицы, без references, на уровне кода. Т. е. не создавая в БД внешние ключи. Но тогда программист берет на себя заботу следить за связями и целостностью данных программно. Без создания внешних ключей в БД можно породить хаос в данных. В идеале за связями нужно следить с двух сторон: и в программе, и в БД. Но только БД позволит не довести до беды и вовремя сигнализировать о возможной ошибке. В данном вопросе мы рассматриваем связи именно на уровне БД.

    5. Можно ли в одной таблице (разных полях) использовать первичный ключ и ограничение уникальности? Может ли ограничение уникальности включать несколько столбцов?

    Ответ на оба вопроса – да.

    Давайте для примера рассмотрим два случая:

    CREATE TABLE public.user4 ( id int PRIMARY KEY, "name" varchar, series_passport varchar UNIQUE NOT NULL, number_passport varchar UNIQUE NOT NULL, age int );
    CREATE TABLE public.user5 ( id int PRIMARY KEY, "name" varchar, series_passport varchar, number_passport varchar, age int, UNIQUE (series_passport, number_passport) );

    В первом случае при добавлении записи будет проверяться каждое значение на уникальность в столбцах, где установлен UNIQUE.

    Например, если у меня есть такая запись в таблице:

    То я не смогу добавить строку со значением series_passport=7777 или number_passport=123454. Будет выдаваться ошибка. То есть проверка уникальности значений происходит по КАЖДОМУ столбцу, где установлен UNIQUE.

    Теперь рассмотрим второй случай.

    Я могу создавать строки с одинаковыми значениями series_passport или number_passport. Но пара этих значений должна быть уникальной. То есть во втором случае происходит проверка СОЧЕТАНИЯ значений всех столбцов.

    6. Сколько первичных ключей может иметь таблица?

    Один и только один. Иначе получаем такую ошибку:

    7. Сколько ограничений уникальности может иметь таблица?

    Сколько угодно. Ограничения на количество нет, но важно понимать целесообразность использования UNIQUE.

    8. Может ли быть разное число столбцов и типы данных полей у внешнего ключа и первичного (или внешнего ключа и UNIQUE)?

    Нет. Типы данных должны быть одинаковые, как и количество столбцов. В ином случае будет возникать ошибка.

    Рассмотрим связь, которую установили в примерах выше.

    У полей user_id и id, одинковый тип данных – int. Если бы тип отличался, или мы бы пытались связать поле user_id с двуми полями, а не одним (id), то установить связь не получилось бы.

    9. Могут ли на одном столбце быть установлены и первичный и внешний ключи?

    Да, могут. Рассмотрим такую задачу. У нас есть три таблицы: продукты, пользователи и отзывы. И есть условие: пользователь на один товар может оставить только один отзыв.

    Я выбрала вот такую реализацию.

    Создаем таблицы пользователи и продукты:

    CREATE TABLE public.user_new ( id int PRIMARY KEY, "name" varchar, age int ); CREATE TABLE public.product ( id int PRIMARY KEY, "name" varchar, price float );

    Далее при создании таблицы Отзывы я установила первичный ключ на два столбца user_id,product_id (то есть сочетание их значений мне нужно проверять):

    CREATE TABLE public.review ( user_id int REFERENCES public.user_new(id), product_id int REFERENCES public.product(id) , "text" varchar, grade int, PRIMARY KEY (user_id,product_id) );

    И с этих же полей я установила связь с внешними таблицами user_new и product.

    И если я захочу добавить запись, где повторяется сочетание user_id + product_id, у меня возникнет ошибка:

    В таблице ниже я собрала разные вопросы, с которыми столкнулась. И на основании тех практических задач, что я разбирала, указала ответы. И получилось следующее:

    Вопрос

    Ответ

    1. Можно ли создать таблицу без первичного ключа?

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

    2. Можно ли использовать UNIQUE вместо PRIMARY KEY? В чем особенности?

    PostgreSQL позволяет это сделать (важно учитывать ограничение NOT NULL), но рекомендуют устанавливать первичный ключ

    3. Можно ли использовать первичный ключ и ограничение уникальности вместе (то есть для одного столбца установить два ограничения)?

    Можно, но это не имеет смыла. В этом случае UNIQUE будет избыточным и не будет учитываться

    4. Можно ли сделать связь с таблицей, в которой не установлено PRIMARY KEY и UNIQUE?

    Нет, это невозможно

    5. Можно ли сделать связь с полем в таблице, где установлен UNIQUE, но не установлен PRIMARY KEY?

    6. Можно ли установить связь между таблицами без внешнего ключа?

    Нет, для установления связи необходимо использовать REFERENCES (на уровне БД )

    7. Можно ли в одной таблице использовать первичный ключ и ограничение уникальности?

    Да, но в разных столбцах. Если использовать для одного столбца UNIQUE и PRIMARY KEY, то UNIQUE будет считаться избыточным и не будет учитываться.

    8. Может ли первичный ключ состоять из нескольких столбцов?

    9. Может ли в одной таблице быть установлено несколько PRIMARY KEY?

    10. Может ли ограничение уникальности включать несколько столбцов?

    11. Сколько ограничений уникальности может иметь таблица?

    12. Может ли быть разное число столбцов и типы данных полей у внешнего ключа и первичного (или внешнего ключа и UNIQUE)?

    Нет, число столбцов и тип данных должен быть одинаковый

    13. Может ли на одном поле быть уставлены и первичный и внешний ключи?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *