#sql #primary-key #unique-key
#sql #первичный ключ #уникальный ключ
Вопрос:
Я наткнулся на 2 версии кода sql..
--1
CREATE TABLE Location (
Id INTEGER PRIMARY KEY
NOT NULL,
Name TEXT NOT NULL
);
--2
CREATE TABLE Location (
Id INTEGER PRIMARY KEY
NOT NULL
UNIQUE,
Name TEXT NOT NULL
);
Необходимо ли в SQL указывать, что первичный ключ должен быть уникальным, а не нулевым?
Я всегда предполагал, что первичный ключ уникален и не может быть нулевым.
Комментарии:
1. Не стесняйтесь попробовать выполнить код.
2. Второй — недопустимый синтаксис.
Both a PRIMARY KEY and UNIQUE constraint have been defined for column 'Id', table 'Location'. Only one is allowed.
3. @Martin. Вторая инструкция sql в sqlite выполняется нормально
4. @Maurice — Ах, извините, я, должно быть, неправильно предположил, что это было помечено
sql-server
(что выдает ошибку выше)5. @Maurice: Почему вы задаете вопрос о TSQL и проверяете соответствующий код в SQLite?
Ответ №1:
Таблица может иметь не более одного первичного ключа, но более одного уникального ключа. Первичный ключ — это комбинация столбцов, которые однозначно определяют строку. Это особый случай уникальных ключей. Одно из отличий заключается в том, что первичные ключи имеют неявное ограничение NOT NULL, в то время как уникальные ключи этого не делают.
Ответ №2:
Указание «УНИКАЛЬНЫЙ» в столбце первичного ключа является избыточным — наличие первичного ключа уже гарантирует, что это будет так.
Комментарии:
1. То же самое верно для NOT NULL, первичные ключи никогда не могут быть обнуляемыми.
Ответ №3:
Как УНИКАЛЬНЫЙ, так и НЕ нулевой, не нужны, поскольку ПЕРВИЧНЫЙ КЛЮЧ подразумевает и то, и другое.
Ответ №4:
Ваш код имеет допустимый синтаксис. Это создаст как PRIMARY KEY
, так и UNIQUE
ограничение, охватывающее один и тот же столбец.
Существуют законные причины для таблицы, имеющей более одного ключа, но не в одном наборе столбцов. В таблице может быть только один ключ, помеченный как «primary». Для каждой таблицы требуется по крайней мере один ключ, но нет необходимости помечать ключ как «первичный», даже если таблица имеет только один ключ.
В SQL Server пометка как «первичный» имеет последствия (например NOT NULL
, ключ по умолчанию при создании ссылки на внешний ключ и т.д.), Но я предпочитаю четко указывать на такие вещи. Предположительно, предполагается, что в вашей таблице должен быть единственный ключ, поэтому я предлагаю вам опустить PRIMARY KEY
. Я также рекомендую вам дать вашему UNIQUE
ключу явное имя, например
CREATE TABLE Location
(
Id INTEGER NOT NULL
CONSTRAINT Location__key UNIQUE,
Name TEXT NOT NULL
);