如何将“nextval('testing_thing_thing_id_seq'::regclass)”声明为 postgres 表“testing_thing”中列“thing_id”的默认值?

Posted

技术标签:

【中文标题】如何将“nextval(\'testing_thing_thing_id_seq\'::regclass)”声明为 postgres 表“testing_thing”中列“thing_id”的默认值?【英文标题】:How to declare "nextval('testing_thing_thing_id_seq'::regclass)" as default value for column "thing_id" in postgres table "testing_thing"?如何将“nextval('testing_thing_thing_id_seq'::regclass)”声明为 postgres 表“testing_thing”中列“thing_id”的默认值? 【发布时间】:2021-12-09 06:27:00 【问题描述】:

在我的 postgres db 中有一个名为 testing_thing 的表,我可以看到(通过在我的 psql 提示符下运行 \d testing_thing)它被定义为

                                        Table "public.testing_thing"

    Column    |       Type        | Collation | Nullable |                       Default                       

--------------+-------------------+-----------+----------+-----------------------------------------------------

 thing_id   | integer           |           | not null | nextval('testing_thing_thing_id_seq'::regclass)

 thing_num  | smallint          |           | not null | 0

 thing_desc | character varying |           | not null | 

Indexes:

    "testing_thing_pk" PRIMARY KEY, btree (thing_num)

我想删除它并按原样重新创建它,但我不知道如何重现

nextval('testing_thing_thing_id_seq'::regclass)

thing_id 列的部分。

这是我用来创建表的查询:

CREATE TABLE testing_thing(
   thing_id integer NOT NULL, --what else should I put here?
   thing_num smallint NOT NULL PRIMARY KEY DEFAULT 0,
   thing_desc varchar(100) NOT NULL
);

缺少什么?

【问题讨论】:

【参考方案1】:

DEFAULT 添加到要递增的列并调用nextval()

CREATE SEQUENCE testing_thing_thing_id_seq START WITH 1;

CREATE TABLE testing_thing(
   thing_id integer NOT NULL DEFAULT nextval('testing_thing_thing_id_seq'),
   thing_num smallint NOT NULL PRIMARY KEY DEFAULT 0,
   thing_desc varchar(100) NOT NULL
);

旁注:请记住,将序列附加到列不会阻止用户手动填充随机数据,这可能会在主键方面产生非常严重的问题。如果您想克服它并且不一定需要有序列,请考虑创建一个标识列,例如

CREATE TABLE testing_thing(
   thing_id integer NOT NULL GENERATED ALWAYS AS IDENTITY,
   thing_num smallint NOT NULL PRIMARY KEY DEFAULT 0,
   thing_desc varchar(100) NOT NULL
);

演示:db<>fiddle

【讨论】:

@Tms91 你必须手动创建一个序列(我将它添加到我的小提琴中),例如:CREATE SEQUENCE testing_thing_thing_id_seq START WITH 1; 该表可能是使用thing_id serial not null primary key 创建的,而不是手动创建和附加序列。这意味着该序列归testing_thing所有。 @Tms91 然后可能是thing_id serial not null,重点是它看起来像serial 伪类型会做什么。 @Tms91 serial 不是标准数据类型,我不推荐使用它,尽管它看起来很实用。如果您负担得起没有序列,请考虑使用标识列 - 它具有相同的效果,它是 SQL 标准并且更安全。干杯! . @mu 太短,如果您想输入您对 serial 的建议作为答案,我很乐意为它投票

以上是关于如何将“nextval('testing_thing_thing_id_seq'::regclass)”声明为 postgres 表“testing_thing”中列“thing_id”的默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式