Oracle - 如何使用 varchar 类型创建自动增量列?

Posted

技术标签:

【中文标题】Oracle - 如何使用 varchar 类型创建自动增量列?【英文标题】:Oracle - How to make auto-increment column with varchar type? 【发布时间】:2014-05-25 14:53:52 【问题描述】:

在我与 Oracle 11g 的作业中,我被要求制作一个具有以下结构的列的表:

    [NL|TE|][0-9]^10

其中在 INSERT 行时输入 NL 或 TE,[0-9]^10 是自动递增的 10 位数字。 示例:

    NL1234567890 or TE0253627576

INSERT 时,用户只应这样写:

    INSERT INTO TableA VALUES ('NL');

DBMS 负责其余的工作。那么我该怎么做呢?在这方面我还是个新手。

【问题讨论】:

查看表触发器 你总是可以使用序列。 @paqogomez 和 Bracuz 刚刚看了 TRIGGER 和序列,看起来像我需要的,但是我怎样才能将两者结合起来呢?由于数据既有字符又有数字。有人可以给我看一个示例 SQL 代码吗? 所有这些都是很好的答案,但@Gary_W 结合了触发器和序列来完全按照您的需要回答问题。 【参考方案1】:

示例代码?

'NL' || to_char(yoursequence.nextval)

【讨论】:

【参考方案2】:

我会将它们保留为单独的列。一个是采用NL 或其他参数的VARCHAR2,另一个是由序列填充的NUMBER。

然后,您可以在查询时将它们连接起来(如果需要,可以将其放在视图中)或使用虚拟列。

为什么?我几乎可以向您保证,在某些时候,您将需要在字符部分或数字部分查询表格,或按其中一个或另一个排序。由于您将它们分开,这很容易。如果您将它们压缩到单个列中,您将不得不在查询时解析出这些值,这会导致代码比您需要的更复杂。

【讨论】:

虽然我同意,但问题的措辞表明这不是一个选择。这可能是一项学术活动。 OP 的问题并没有暗示这些事情中的任何一个。他“被要求”建造一些有用的东西。该解决方案将完全按照需要工作 - 我以前使用过这种技术。 @JeffreyKemp 谢谢,我会记住这个技巧,但 Bracuk 猜对了,这是一项学术作业,我什至无法更改列数据类型。【参考方案3】:
CREATE SEQUENCE your_seq;
/

CREATE OR REPLACE TRIGGER your_tablename_BI
BEFORE INSERT
ON your_tablename
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
 :NEW.your_col := :NEW.your_col || trim(to_char(your_seq.nextval, '0000000000'));

END your_tablename_BI;
/

【讨论】:

如果您以足够高的值开始序列,则不必连接 0。 这段代码可以做到。但是你能解释一下最后的“your_tablename_BU”吗?我没有在 TRIGGER 语法中看到它。 @Tr1et 对不起,我不清楚。这只是触发器的名称; “插入前”带有“BI”的表的名称(您也可以有其他触发器)。哎呀,这也是一个错字,应该是“BI”。我更正了。

以上是关于Oracle - 如何使用 varchar 类型创建自动增量列?的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库之如何将blob类型转换为varchar2

如何将oracle表中的字段由integer 转变为varchar2(50)

oracle 如何将字段类型varchar 改为blob 更改提示数据类型的变更无效

DB2中如何将一个clob类型的字段改为varchar类型

Oracle的varchar2如何比较大小

oracle中varchar2类型与integer类型的变量进行运算