【问题标题】:Custom generated Identity column in OracleOracle 中自定义生成的标识列
【发布时间】:2021-11-24 23:05:42
【问题描述】:

我阅读了 Oracle 中 Identity 列的文档,如下所述:https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/creating-tables-identity-column .html

文档提到序列生成器插入标识列的值是整数。这可以在这里找到 https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/sequence-generator-attributes.html

现在,我的问题是:有没有办法为标识列生成自定义值? 除了整数值。比如说,像 'ID001'、'ID002' 等这样的字符串?
非常感谢提前

【问题讨论】:

  • 您正在阅读错误的手册。这与 Oracle 关系数据库无关。这是Oracle NoSQL的JDBC驱动手册
  • ... 或者 tag 是错误的;)

标签: sql oracle


【解决方案1】:

首先想一想为什么要使用字符串作为主键

你看到一些优势了吗? (除了使用更多存储空间?)

其次使用您的密钥(例如 ID001)考虑如果您的行数超过 1000 行会发生什么...

一种解释是您正在寻找该行的一些用户可读标识。这可以使用标准IDENTITY 加上额外的virtual column

来提供

示例

create table MY_TABLE (
ID number(19,0) generated as identity, 
ID_DESC varchar2(255 char) generated always as ('ID'||ID) virtual,
col int,
primary key (ID))
;

insert into my_table(col)
select rownum from dual connect by level <= 3;


select id, id_desc from  my_table order by id;

        ID ID_DESC
---------- ---------        
         1 ID1                                                                                                                                                                                                                                                            
         2 ID2                                                                                                                                                                                                                                                            
         3 ID3 

【讨论】:

  • 谢谢 MarmiteBomber。这提供了另一个很好的视角。 @Littlefoot 给出的答案解释了我想要什么。我会更改标签。很抱歉造成混乱。
【解决方案2】:

这是可能的,但您必须对此做一些事情(即编写一些代码 - 一个触发器)。这是一个例子。

样本表;它的 ID 列应该是自动生成的:

SQL> create table test (id varchar2(10), name varchar2(10));

Table created.

一个序列,将在触发器中使用:

SQL> create sequence seq_test;

Sequence created.

触发器相当简单;它将ID 与一个序列号连接起来,在左边用零填充,长度最多为 3 个字符(如您的示例所说):

SQL> create or replace trigger trg_bi_test
  2    before insert on test
  3    for each row
  4  begin
  5    :new.id := 'ID' || lpad(seq_test.nextval, 3, '0');
  6  end;
  7  /

Trigger created.

测试:

SQL> insert into test (name) values ('Little');

1 row created.

SQL> insert into test (name)
  2    select 'Foot'      from dual union all
  3    select 'Equalizer' from dual;

2 rows created.

SQL> select * from test order by id;

ID         NAME
---------- ----------
ID001      Little
ID002      Foot
ID003      Equalizer

SQL>

附:您发布的链接与“传统”Oracle 数据库无关;检查例如CREATE TABLE 文档,它包含有关身份列的信息。您的链接与 NoSQL 数据库有关。

【讨论】:

  • 这有助于@Littlefoot。谢谢你。对不起,我错误地分配了标签:)
猜你喜欢
  • 2021-09-08
  • 2016-09-09
  • 2021-07-14
  • 2011-03-21
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多