postgresql ОШИБКА: синтаксическая ошибка в или около "ПЕРВИЧНОГО" - PullRequest
2 голосов
/ 29 февраля 2020

Я новичок в PostgreSQL. Я пытался создать таблицы в базе данных, но некоторые запросы дают странные ошибки. первый фрагмент генерирует синтаксическую ошибку, но когда я добавляю «serial» в столбец проблемати c, ошибка устраняется. Должны ли все первичные ключи автоматически увеличиваться в PostgreSQL?

CREATE TABLE songplays(
   songplay_id PRIMARY KEY, --This does not work, it throws syntax error at or near "PRIMARY"
   start_time VARCHAR (50) NOT NULL,
   user_id VARCHAR (50) NOT NULL,
   level VARCHAR (355) UNIQUE NOT NULL,
   song_id VARCHAR (50) NOT NULL NOT NULL,
   artist_id VARCHAR (50) NOT NULL NOT NULL,
   session_id VARCHAR (50) NOT NULL NOT NULL,
   location VARCHAR (50) NOT NULL NOT NULL,
   user_agent VARCHAR (50) NOT NULL NOT NULL
);

В этой работе добавлено последовательное ограничение для songplay_id

CREATE TABLE songplays(
   songplay_id serial PRIMARY KEY,
   start_time VARCHAR (50) NOT NULL,
   user_id VARCHAR (50) NOT NULL,
   level VARCHAR (355) UNIQUE NOT NULL,
   song_id VARCHAR (50) NOT NULL NOT NULL,
   artist_id VARCHAR (50) NOT NULL NOT NULL,
   session_id VARCHAR (50) NOT NULL NOT NULL,
   location VARCHAR (50) NOT NULL NOT NULL,
   user_agent VARCHAR (50) NOT NULL NOT NULL
);

Ответы [ 2 ]

4 голосов
/ 29 февраля 2020

Следует ли автоматически увеличивать все первичные ключи в PostgreSQL?

Нет, не обязательно.

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

 songplay_id integer PRIMARY KEY,

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

2 голосов
/ 29 февраля 2020

Postgres create table синтаксис :

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] ) 

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

songplay_id PRIMARY KEY

Если вы не используете специальный тип данных SERIAL, вам все равно придется указать тип данных, например:

 songplay_id INTEGER PRIMARY KEY
...