如何在 Oracle 11g 中创建自动增量?

Posted

技术标签:

【中文标题】如何在 Oracle 11g 中创建自动增量?【英文标题】:How do you create an auto increment in Oracle 11g? 【发布时间】:2016-08-09 01:45:48 【问题描述】:

我想为 Oracle 11g 中的主键生成一个 7 位标识符。主键的长度必须为 7 位。

这是我的代码:

CREATE SEQUENCE sequence_staff
MINVALUE 1
START WITH 1
INCREMENT BY 1;

CREATE TABLE Staff (
    Staff_ID    INT PRIMARY KEY, --Autoincrement 7 digit --PK
    Surname     VARCHAR2(50) NOT NULL,
    Firstnames  VARCHAR2(50) NOT NULL,
    Phone       VARCHAR2(30) NOT NULL,  --D1
    Address     VARCHAR2(150) NOT NULL
);

当前主键是 1(1 位),而不是 0000001(7 位)。有什么想法吗?

【问题讨论】:

从 1000000 开始! 是否可以有这样的主键:0000001? Creating a sequence for a varchar2 field in Oracle的可能重复 如果你从 1 开始,你不能有一个总是七位数的数字(在你的情况下是 int);前导零不是数字的一部分。您可以拥有一个用零填充序列值填充的七字符列;或者你可以有一个数字,你可以用零填充来显示(或在虚拟列中)。你要哪个? 【参考方案1】:

你必须修改顺序如下:

CREATE SEQUENCE sequence_staff
MINVALUE 1000000
START WITH 1000000
INCREMENT BY 1 NOCACHE NOCYCLE;

此外,您必须始终使用 sequence_staff.nextval 插入新的 staff_id 列。看看它是如何工作的

select sequence_staff.nextval from dual; --repeated times.

在此处阅读有关序列的更多信息https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm

编辑:

是的,这是可能的。以您创建的方式创建序列:

select to_char(sequence_staff.nextval,'FM0000000') from dual;

编辑 2:

此链接值得称赞。 http://***.com/questions/14561210/creating-a-sequence-for-a-varchar2-field-in-oracle

编辑 3:如果您真的希望在 Oracle 数据库中以您的方式获得结果,您必须:

1. alter table staff modify staff_id varchar(20);
2. CREATE SEQUENCE sequence_staff
MINVALUE 1
START WITH 1
INCREMENT BY 1 NOCACHE NOCYCLE;
3. insert into staff(Staff_id, surname,firstnames, phone,address) values(to_char(sequence_staff.nextval,'FM0000000'),'Wayne','Bruce','0000','Gotha‌​m'); 

【讨论】:

谢谢,但是否可以从 1 开始,仍然有 7 位数字?比如0000001 但我想以 7 位形式将其存储在数据库中,而不是在查询中。我如何将其放入插入中? 每当你插入数据库时​​,你应该使用:插入员工(员工id,姓,名字,电话,地址)值(to_char(sequence_staff.nextval,'FM0000000'),'Wayne', '布鲁斯','0000','哥谭'); 如果你在 mysql 中寻找类似自动增量的东西,Oracle 中不存在。你必须使用序列。此外,您必须将主键的数据类型更改为 varchar。根据您的要求,不能使用 int。 不工作我得到一个从 420 开始的随机数。但我指定从 1 开始【参考方案2】:
CREATE TABLE staff 
    ( 
        id         NUMBER(7) NOT NULL, 
            surname    VARCHAR2(50) NOT NULL, 
                firstnames VARCHAR2(50) NOT NULL, 
                    phone      VARCHAR2(30) NOT NULL, 
                        address    VARCHAR2(150) NOT NULL 
  );



ALTER TABLE Staff ADD (
  CONSTRAINT staff_pk PRIMARY KEY (ID));

    CREATE SEQUENCE staff_seq START WITH 1;

触发器定义:

            CREATE OR REPLACE TRIGGER staff_bir 
                BEFORE INSERT ON Staff 
                    FOR EACH ROW

                        BEGIN
                            SELECT staff_seq.NEXTVAL
                                INTO   :new.id
                                    FROM   dual;
                                       END;

【讨论】:

如 cmets 中所述,他希望该号码始终存储为 7 位数字,因此这不能满足他的需要。他需要使用 varchar 或从 1000000 开始。

以上是关于如何在 Oracle 11g 中创建自动增量?的主要内容,如果未能解决你的问题,请参考以下文章