Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres创建表错误_Sql_Postgresql - Fatal编程技术网

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`只是一个超级方便的缩写,它不是真正的“替代品”,而是一个缩写。