Oracle 数据库中的自动递增列
在 Oracle 数据库中,与其他数据库系统不同,直到 11g 版本之前,都不存在自动递增列的概念。这在创建需要自动递增标识符的表时会带来挑战。幸运的是,可以使用序列和触发器来模拟这种行为。
使用序列和触发器进行模拟
在 Oracle 11g 及更早版本中,您可以创建序列和触发器来模拟自动递增列。首先,定义一个包含用作标识符的数值列的表:
<code class="language-sql">CREATE TABLE departments ( ID NUMBER(10) NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL ); ALTER TABLE departments ADD ( CONSTRAINT dept_pk PRIMARY KEY (ID) ); CREATE SEQUENCE dept_seq START WITH 1;</code>
接下来,创建一个触发器,在插入新记录时使用序列的下一个值填充 ID 列:
<code class="language-sql">CREATE OR REPLACE TRIGGER dept_bir BEFORE INSERT ON departments FOR EACH ROW BEGIN SELECT dept_seq.NEXTVAL INTO :new.id FROM dual; END;</code>
标识列 (Oracle 12c 及更高版本)
从 Oracle 12c 开始,引入了标识列作为真正的自动递增功能。您可以按如下方式在表中定义标识列:
<code class="language-sql">CREATE TABLE t1 ( c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, c2 VARCHAR2(10) );</code>
标识列还可以指定起始值和增量值以防止手动更新:
<code class="language-sql">CREATE TABLE t1 ( c1 NUMBER GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1), c2 VARCHAR2(10) );</code>
使用序列作为默认值的替代方法
Oracle 12 还提供了一种使用序列作为默认值的方法:
<code class="language-sql">CREATE SEQUENCE dept_seq START WITH 1; CREATE TABLE departments ( ID NUMBER(10) DEFAULT dept_seq.NEXTVAL NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL );</code>
以上是如何在Oracle数据库中创建自动递增列?的详细内容。更多信息请关注PHP中文网其他相关文章!