postgresql错误:“ PRIMARY”处或附近的语法错误

问题描述 投票:1回答:2

我是PostgreSQL的新手。我一直在尝试在数据库中创建表,但是一些查询给出了奇怪的错误。第一个代码段引发语法错误,但是当我在有问题的列上添加“序列”约束时,该错误得以解决。 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
);
sql postgresql constraints ddl create-table
2个回答
1
投票

PostgreSQL中所有主键都应该自动递增吗?

不,不一定。

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

 songplay_id integer PRIMARY KEY,

请注意,serial不是“约束”,它是数据类型定义,它是整数列的快捷方式,该整数列从序列中获取其默认值。


0
投票

Postgres create table syntax是:

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
© www.soinside.com 2019 - 2024. All rights reserved.