Sql Postgres创建表错误
我试图在Sql Postgres创建表错误,sql,postgresql,Sql,Postgresql,我试图在postgres中创建我的第一个表,但当我执行此SQL时: create table public.automated_group_msg ( automated_group_msg_idx integer NOT NULL DEFAULT nextval ('automated_group_msg_idx'::regclass), group_idx integer NOT NULL, template_idx integer NOT NULL, CONSTRAINT
postgres
中创建我的第一个表,但当我执行此SQL时:
create table public.automated_group_msg (
automated_group_msg_idx integer NOT NULL DEFAULT nextval ('automated_group_msg_idx'::regclass),
group_idx integer NOT NULL,
template_idx integer NOT NULL,
CONSTRAINT automated_group_msg_pkey PRIMARY KEY (automated_group_msg_idx),
CONSTRAINT automated_group_msg_group_idx_fkey FOREIGN KEY (group_idx)
REFERENCES public.groups (group_idx) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT automated_msg_template_idx_fkey FOREIGN KEY (template_idx)
REFERENCES public.template (template_idx) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
WITH (
OIDS = FALSE
);
我得到以下错误:
错误:关系“自动\u组\u消息\u idx”不存在
您的错误(可能)是因为您尝试使用的序列尚不存在
但您可以使用以下语法动态创建序列:
create table public.automated_group_msg (
id serial primary key,
... -- other columns
)
与您的问题没有直接关系,但是用列名称中的表名命名列通常是一种反模式,特别是对于
id
是行业标准的主键。它还允许使用id列始终为id
的抽象类重构应用程序代码。非常清楚的是,automated\u group\u msg.id
是什么意思,也非常清楚的是,automated\u group\u msg.id
是火车失事,包含冗余信息。属性列名,如customer.birth\u date
也不应过度修饰为customer.customer\u birth\u date
,原因相同。是否只希望automated\u group\u msg\u idx
成为自动递增id?是的。这是自动递增的主键查看postgres文档,似乎nextval也应该像serial一样工作。事实上,我在查看我正在使用的数据库,这就是一些表的模式定义方式,所以从语法上考虑,我编写的方法应该是正确的。@user8895989否-大部分是错误的。在postgres中,使用序列
对象实现自动递增。引用序列的nextval
的表定义要求已创建序列对象。与许多对象的SQL检查一样,显示的SQL是postgres对SQL的内部表示,而不是DBA/dev最初输入的SQL。但是,手动执行此操作没有任何好处-只需使用方便的serial
语法即可。单独定义序列不会给你带来任何好处,除了打字练习。谢谢,这真的很有帮助。此外,您建议的命名约定完全有道理,这是一种过分的做法,可能会使事情变得更加混乱。感谢您的精彩反馈。当然,另一种方法是在创建表之前创建序列,这可能就是您在数据库转储中找到的。它可能还包括设置序列的当前值。@jcaron这正是执行前将serial
转换为的内容:一个create sequence
和一个引用序列的create table
serial`只是一个超级方便的缩写,它不是真正的“替代品”,而是一个缩写。