#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. Я консультировался
- https://www.w3schools.com/sql/sql_create_table.asp
- https://www.w3schools.com/sql/sql_constraints.asp
но не смог решить эти проблемы самостоятельно.
Комментарии:
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)
);