我写了一个简单的序列。我将其用于所有表格

I wrote a simple sequence. I use it for all tables

提问人:Pitt Bear 提问时间:10/24/2023 更新时间:10/24/2023 访问量:58

问:

为什么:不一一发送ID号?为什么有些表以 126 开头,而这些表是第一个条目?我是否必须为每个表制作单独的序列?

创建序列“MMDS”。NEXT_ID“ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 201 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;

在此处输入图像描述

在此处输入图像描述

PLSQL 序列

评论

0赞 Koen Lostrie 10/24/2023
有缓存没有顺序有问题吗?我知道这感觉不对劲,但对于您的应用程序和数据来说,这很可能不会有什么不同

答:

1赞 Littlefoot 10/24/2023 #1

使用这两个选项中的任何一个都没有问题:您可以为所有表使用一个序列(更简单),也可以为每个表使用一个序列(更复杂,因为您必须手动创建它)。

序列可确保你获得唯一值,但它们不会是连续的。您的“问题”与缓存有关。它用于更好的性能,因为 Oracle 一次“保留”20 个值。如果您不使用所有这些,它们将丢失。但是 - 没关系,这在大多数情况下是无关紧要的。如果你真的需要有连续的值,你将不得不开发你自己的解决方案(有一个单独的表,自治事务功能,担心回滚和删除的值,......没那么简单)。


您可能要考虑的另一个选项是使用标识列 - 如果您的数据库版本支持它。Oracle 仍将使用(并在后台创建)序列,但该选项使用起来更简单,因为您不必执行任何操作 - 只需这样声明列,例如

SQL> create table my_test
  2    (id    number   generated always as identity primary key);

Table created.

SQL> select sequence_name from user_sequences;

SEQUENCE_NAME
--------------------------------------------------------------------------------

ISEQ$$_142849

[编辑],根据您的评论

这是 18c,是的 - 它支持标识列,但您必须使用有效的语法。

SQL> select banner From v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production

SQL> create table a1_sociala
  2    (id_measurement number generated by default as identity,
  3     name           varchar2(20)
  4    );

Table created.

SQL> insert into a1_sociala (name) values ('Littlefoot');

1 row created.

SQL> select * from a1_sociala;

ID_MEASUREMENT NAME
-------------- --------------------
             1 Littlefoot

SQL>

评论

0赞 Pitt Bear 10/24/2023
谢谢同事们,我尝试更改更改表 socialaaaa 修改默认生成的 id_measurement 作为标识(以 1 个增量乘以 1 个缓存 1 开头) ORA-30673:要修改的列不是标识列 我正在使用 Oracle Database 18c Express。您能否确认此版本支持或不支持默认生成作为标识
0赞 Littlefoot 10/24/2023
是的,确实如此。请看一下编辑后的答案。
0赞 Pitt Bear 10/24/2023
你能告诉我我哪里犯了错误吗?~~~alter table socialaaaa 修改默认生成的 id_measurement 作为标识(以 1 个增量 1 个缓存 1 开头)~~~ ORA-30673:要修改的列不是标识列 30673.0000 - “要修改的列不是标识列” *原因:尝试修改不是标识列的标识属性。*操作:修改标识列的标识属性。
0赞 Littlefoot 10/24/2023
ID_MEASUREMENT似乎是一个“普通”列,但它不是一个标识列,因此您不能将 ALTER TABLE 语句应用于它。据我所知,你不能那样做。相反,如果必须,请向现有表添加新的 IDENTITY 列,并删除旧的 ID 列。注意现有的价值观!或者,不要使用 IDENTITY 列,而是创建一个序列和一个触发器,这两个触发器将像您有一个 IDENTITY 列一样工作。