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
我是 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