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)