Oracle数据库中的自增主键

6

我希望在一个类似于SQL Server的列中实现标识或自增值:

CREATE TABLE RollingStock
( 
      Id NUMBER IDENTITY(1,1),
      Name Varchar2(80) NOT NULL      
);

如何实现这一点?

3
可能是https://dev59.com/O3RC5IYBdhLWcg3wYP6h中的重复问题,涉及Oracle中的自增。 - DCookie
2个回答

10

就像Orbman所说的那样,标准的方法是使用序列。大多数人还会将其与插入触发器相结合。因此,当插入一行数据时如果没有ID,触发器会触发并从序列中为您填充ID。

CREATE SEQUENCE SEQ_ROLLINGSTOCK_ID START WITH 1 INCREMENT BY 1 NOCYCLE;

CREATE OR REPLACE TRIGGER BI_ROLLINGSTOCK
BEFORE INSERT ON ROLLINGSTOCK
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
 WHEN (NEW.ID IS NULL)
BEGIN
  select SEQ_ROLLINGSTOCK_ID.NEXTVAL
   INTO :NEW.ID from dual;
END;

这是为数不多的几种情况之一,在Oracle中使用触发器是有意义的。


请注意,触发器并不是完全必要的。只要在执行插入操作时使用序列中的值即可。虽然它不是自动的,但也不需要太多的纪律。出于个人口味的考虑,我极力避免使用触发器。 - Adam Hawkes
@Adam,我完全同意。这是我会使用触发器的少数几个地方之一,主要是由于我管理的数据库中缺乏可怕的命名标准,使得几乎不可能知道正确的顺序。 - Matthew Watson

4

如果您真的不在乎主键包含什么内容,可以使用RAW类型作为主键列,该列保存二进制形式的系统生成的GUID。

CREATE TABLE RollingStock 
(  
  ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY, 
  NAME VARCHAR2(80 CHAR) NOT NULL       
); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接