【问题标题】:Oracle - How to make auto-increment column with varchar type?Oracle - 如何使用 varchar 类型创建自动增量列?
【发布时间】: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 结合了触发器和序列来完全按照您的需要回答问题。

标签: sql oracle auto-increment


【解决方案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”。我更正了。
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2016-08-09
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多