postgresql ERROR: syntax error at or near "PRIMARY"

postgresql ERROR: syntax error at or near "PRIMARY"

我是 PostgreSQL 的新手。我一直在尝试在数据库中创建表,但有些查询会出现奇怪的错误。第一个片段抛出语法错误,但是当我在有问题的列上添加 "serial" 时,错误得到解决。 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
);

Should all primary keys auto-increment in PostgreSQL?

不,不一定。

在第一条语句中,您没有为列指定数据类型,如果您不希望它是自动递增的,只需使用整数:

 songplay_id integer PRIMARY KEY,

请注意 serial 不是 "constraint",它是一种数据类型定义,它是从序列中获取默认值的整数列的快捷方式。

Postgres create table syntax 是:

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