如何在 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 中创建自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Oracle 11g 中创建用户并授予权限

在Oracle 11g 中创建表时如何保存表?

Oracle 自动增量触发器问题

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何使用 EF 核心在 SQLite 中创建自动增量列?

如何在 Access 2010 的选择查询中创建自动增量字段?