Неясные ограничения в SQL для СОЗДАНИЯ ТАБЛИЦЫ

#sql

#sql

Вопрос:

В курсе Coursera есть фрагмент кода:

введите описание изображения здесь

Я не понимаю частей:

  • CONSTRAINT AUTHOR_PK
  • (author_id) (после PRIMARY KEY )

Не могли бы вы, пожалуйста, объяснить?

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

Потому (author_id) что я не понимаю его присутствия. Поскольку PRIMARY KEY записывается в той же строке, author_id что и, разве это уже не подразумевается, что author_id будет использоваться в качестве первичного ключа?

Я очень новичок в SQL. Я консультировался

но не смог решить эти проблемы самостоятельно.

Комментарии:

1. Где вы нашли эту ТАБЛИЦУ CREATE? Синтаксис очень странный и недопустимый ISO / ANSI SQL. w3 * ools я бы не рекомендовал.

2. @jarlh Это видео под названием CREATE Table Statement из курса Coursera «Базы данных и SQL для науки о данных». Какой источник вы бы порекомендовали вместо w3?

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

4. postgresqltutorial.com или sqlzoo.net/wiki/Main_Page или pgexercises.com лучше, чем w3fools.

Ответ №1:

Существует два типа ограничений, которые вы можете создать в CREATE TABLE инструкции. Это ограничения столбцов и ограничения таблиц.

Ограничения столбцов включены в определение одного столбца.

Ограничения таблицы включены как отдельные объявления, а не как часть определения столбца.

Это та же таблица с первичным ключом, объявленным как ограничение таблицы:

 CREATE TABLE Author
(author_id CHAR(2),
 lastname VARCHAR(15) not null,
...,
CONSTRAINT PK_AUTHOR PRIMARY KEY (author_id)
)
  

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

PK_AUTHOR , как в вашем примере, так и в моем, используется для присвоения ограничению определенного имени. Это полезно, если вам позже понадобится удалить ограничение. Если вы не хотите называть ограничение, CONSTRAINT PK_AUTHOR оно может быть опущено в любом sampe.

Комментарии:

1. Я думаю, что «встроенное» имя ограничения действительно является частью стандарта SQL (и, например, поддерживается Postgres и Oracle). Однако, как вы упомянули, включение имени столбца недопустимо.

Ответ №2:

CONSTRAINT Ключевое слово необходимо, когда вы хотите указать конкретное имя для ограничения, в данном случае AUTHOR_PK . Если вы этого не сделаете, имя будет сгенерировано автоматически, а эти имена обычно не очень полезны. Все NOT NULL ограничения в этом примере будут иметь автоматически сгенерированные имена.

По моему опыту, стандартной практикой является присвоение имен всем ограничениям, кроме NOT NULL.

Я думаю, вы правы (author_id) , в этом примере нет необходимости, поскольку это подразумевается тем фактом, что ограничение уже объявлено для этого столбца. Но синтаксис позволяет это. (Интересно, позволит ли это указать другой столбец в этой позиции — я так не думаю, но не пробовал.)

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

 ...
country  CHAR(2),
CONSTRAINT one_city_per_country UNIQUE (country,city)
);