广告
返回顶部
首页 > 资讯 > 数据库 >Oracle12c如何实现自增列
  • 850
分享到

Oracle12c如何实现自增列

2024-04-02 19:04:59 850人浏览 安东尼
摘要

小编给大家分享一下oracle12c如何实现自增列,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.Mysql自增列众所周知,m

小编给大家分享一下oracle12c如何实现自增列,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一.Mysql自增列

众所周知,mysql有自增列功能。

Mysql中每张表只能有一个自增列,并且自增列必须是主键或者唯一键。

mysql> create table test2(id int not   null auto_increment);

ERROR 1075 (42000): Incorrect table   definition; there can be only one auto column and it must be defined as a key

mysql> create table test2(id int not   null auto_increment primary key);

Query OK, 0 rows affected (0.01 sec)

Mysql插入空值,可以看到是允许的,默认会用自增列值插入。

mysql> insert into test2   values();    

Query OK, 1 row affected (0.01 sec)

 

mysql> select * from test2;

+----+

| id |

+----+

|    1 |

+----+

1 row in set (0.00 sec)

Mysql也是允许插入的值不连续

mysql> insert into test2 values(3);

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from test2;       

+----+

| id |

+----+

|    1 |

|    3 |

+----+

2 rows in set (0.00 sec)

表加一列,显式插入新增列,自增列会隐式地从当前最大值自增。

mysql> insert into test2(b) values(4);

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from test2;

+----+------+

| id | b    |

+----+------+

|    1 | NULL |

|    3 | NULL |

|    4 |    4 |

+----+------+

3 rows in set (0.00 sec)

二.Oracle自增列

Oracle在12c之前的版本,自增列功能只能通过序列+触发器的方式实现。12c版本终于迎来了这个新功能。

自增列语法

 Oracle12c如何实现自增列

建表

SQL> CREATE TABLE test1 (

    2  id int GENERATED ALWAYS AS IDENTITY

    3  );

 

Table created.

SQL> desc test1

 Name                                        Null?    Type

 -----------------------------------------   -------- ----------------------------

 ID                                        NOT   NULL NUMBER(38)

自增列会自动加上not null约束。

此时会自动生成一个序列

SQL> select   SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,CACHE_SIZE from dba_sequences   where SEQUENCE_OWNER='MING';

 

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY CACHE_SIZE

------------------------------ ----------   ---------- ------------ ----------

ISEQ$$_45410                            1   1.0000E+28            1         20

SQL> set line 150

SQL> select   TABLE_NAME,COLUMN_NAME,DATA_DEFAULT from dba_tab_columns where   TABLE_NAME='TEST1' and COLUMN_NAME='ID';

 

TABLE_NAME                     COLUMN_NAME                    DATA_DEFAULT

------------------------------   ------------------------------   --------------------------------------------------

TEST1                          ID                               "MING"."ISEQ$$_45410".nextval

注意下面这两个动作

SQL> select ISEQ$$_45410.nextval from   dual;

 

     NEXTVAL

----------

           1

 

SQL> select ISEQ$$_45410.nextval from   dual;

 

     NEXTVAL

----------

           2

插入一个值

 

SQL> insert into test1 values(1);

insert into test1 values(1)

*

ERROR at line 1:

ORA-32795: cannot insert into a generated   always identity column

不能向自增列插入值。

SQL> alter table test1 add b int;

 

Table altered.

 

SQL> insert into test1(b) values(1);

 

1 row created.

 

SQL> select * from test1;

 

          ID          B

---------- ----------

           3          1

可以看到ID列插入了值,但是不是1,而是3.因为之前手动select从序列中取过值。

经过上面实验不难猜测,下面语句会报错

SQL> insert into test1(id,b) values(4,1);

insert into test1(id,b) values(4,1)

                  *

ERROR at line 1:

ORA-32795: cannot insert into a generated   always identity column

Update和delete

SQL> update test1 set id=5;

update test1 set id=5

                 *

ERROR at line 1:

ORA-32796: cannot update a generated   always identity column

 

SQL> delete from test1;

 

1 row deleted.

 

SQL> commit;

 

Commit complete.

Update不可以,但是delete是可以的。

可以用default指代

SQL> insert into test1 values(default,1);

 

1 row created.

 

SQL> select * from test1;

 

          ID          B

---------- ----------

           5          1

 

 

SQL> commit;

 

Commit complete.

生成的序列其他用户也是可以用的

SQL> insert into tx(a)   values(ISEQ$$_45410.nextval);

 

1 row created.

 

SQL> commit;

 

Commit complete.

这个序列是不能删除的。

SQL> drop sequence ming.ISEQ$$_45410;

drop sequence ming.ISEQ$$_45410

                   *

ERROR at line 1:

ORA-32794: cannot drop a system-generated   sequence

 

SQL> drop table test1;

 

Table dropped.

 

SQL> select ISEQ$$_45410.nextval from   dual;

 

     NEXTVAL

----------

           6

Purge回收站后就没有了。

SQL> purge recyclebin;

 

Recyclebin purged.

所以在删除表时可以加purge,加cascade constraint也不会马上删除序列。

SQL> CREATE TABLE test2 (

    2  id int GENERATED BY DEFAULT ON NULL AS IDENTITY

    3  );

 

Table created.

 

SQL> insert into test2 values('');

 

1 row created.

 

SQL> select * from test2;

 

          ID

----------

           1

Insert可以指定值,但是指定的值不会被序列识别,换句话说,如果手动插入值2,序列的下一个值是2,那么在此插入空的时候,会插入2,而不是3.

 

SQL> insert into test2 values(4);

 

1 row created.

 

SQL> insert into test2 values(3);

 

1 row created.

 

SQL> commit;

 

Commit complete.

 

SQL> select ISEQ$$_45418.nextval from   dual;

 

     NEXTVAL

----------

           3

 

SQL> select * from test2;

 

          ID

----------

           1

           2

           4

           3

 

SQL> insert into test2 values('');

 

1 row created.

 

SQL> select * from test2;

 

          ID

----------

           1

           2

           4

           3

           4

下面这个Update的动作有点意思,当前表上有2条ID=4的值,用default更新的时候会用序列赋予不同的值。

 

SQL> update test2 set id=default where   id=4;

 

2 rows updated.

 

SQL> select * from test2;

 

          ID

----------

           1

           2

           5

           3

           6

既然已经知道,自增列是用序列创建的,那么下面两种方式也是可以的

create sequence ming$seq01 minvalue 1   maxvalue 9999999 start with 1 increment by 2   cache 20 nocycle;

create table test3(id int default   ming$seq01.nextval);

 

create table test3(id number);

alter table test3 modify id number   default seq_1.nextval;

区别在于是插入null的时候不会变成数字,该列也没有not null约束。

 

SQL> insert into test3 values(null);

 

1 row created.

 

SQL> select * from test3;

 

          ID

----------

 

l  Oracle自增列是利用序列做到的。自增列会自动加上非空约束;

l  表删除的时候,序列不会马上删除,这是因为删除的表会进入回收站,要关联删除需要加purge;

l  GENERATED ALWAYS AS IDENTITY可以delete,不能显示insert,不能update;

l  GENERATED BY DEFAULT ON NULL AS IDENTITY会自动将null值插入序列中的值,增删改都可以,相比GENERATED ALWAYS AS IDENTITY更加灵活,但是列的唯一性不能保证。

l  受自增列启发,可以自己创建序列,指定为表列的默认值。

l  系统自建序列的属性不能更改,可以在创建自增列的时候手动修改,否则较小cache默认值,会造成性能问题。Like this:

CREATE TABLE test4 (id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 10 cache 100));

l  其他用户如果要向带有自增列表中插入数据的话,那么需要序列权限

以上是“Oracle12c如何实现自增列”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Oracle12c如何实现自增列

本文链接: https://www.lsjlt.com/news/64049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle12c如何实现自增列
    小编给大家分享一下Oracle12c如何实现自增列,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一.Mysql自增列众所周知,m...
    99+
    2022-10-18
  • oracle列自增实现
    1.Sequence+Trigger实现Oracle列自增CREATE SEQUENCE 序列名[INCREMENT BY n][START WITH n][{MAXVALUE/MINVALUE n|NOM...
    99+
    2022-10-18
  • redis自增序列怎么实现
    Redis自增序列可以通过以下几种方式实现:1、使用INCR命令:使用Redis的INCR命令可以对一个指定的键进行自增操作。比如,...
    99+
    2023-05-23
    redis自增序列 redis
  • 通过触发器和自增序列实现oracle自增ID
    create sequence seq_tablename        start with 1        increment by 1;  create or replace trigger tri_tablename_i...
    99+
    2019-01-19
    通过触发器和自增序列实现oracle自增ID
  • SQL SERVER中怎么实现自增列
    这期内容当中小编将会给大家带来有关SQL SERVER中怎么实现自增列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。declare @Table_name varcha&...
    99+
    2022-10-18
  • mysql实现自增序列的方法
    这篇文章主要为大家展示了“mysql实现自增序列的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql实现自增序列的方法”这篇文章吧。1.创建seque...
    99+
    2022-10-18
  • ADO.NET自动增量列怎么实现
    本篇内容介绍了“ADO.NET自动增量列怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.ADO.NET表达式列ADO.NET还允许...
    99+
    2023-06-17
  • Oracle中如何用序列和触发器实现ID自增
    小编给大家分享一下Oracle中如何用序列和触发器实现ID自增,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在设计数据库的时候,Oracle中没有类似SQL Server中系统自动分配ID作为...
    99+
    2022-10-18
  • mysql实现自增序列的示例代码
    创建sequence表 CREATE TABLE `sequence` ( `name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',...
    99+
    2022-05-28
    mysql 自增序列
  • 如何理解mysql自增长列
    本篇文章给大家分享的是有关如何理解mysql自增长列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 自增长列必须是...
    99+
    2022-10-19
  • pandas添加自增列的2种实现方案
    有时候我们需要添加一列自动增加数字的列,可以用下面两种方法: 第一种 >>> import pandas as pd >>> df = pd....
    99+
    2022-11-11
  • 在MySQL中创建实现自增的序列(Sequence)
    由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下: 第一步:创建--Sequence 管理表 DROP...
    99+
    2022-10-18
  • oracle如何创建自增序列表
    在Oracle中,可以使用序列(Sequence)来创建自增序列。序列是一个独立的对象,用于生成唯一的、递增的数字。以下是使用序列创...
    99+
    2023-09-23
    oracle
  • Mybatis-Plus如何获取自增列id
    今天小编给大家分享一下Mybatis-Plus如何获取自增列id的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。新增获取自增列...
    99+
    2023-06-26
  • Oracle12C如何实现闪回技术
    这篇文章将为大家详细讲解有关Oracle12C如何实现闪回技术,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.Oracle Flashback Query  ...
    99+
    2022-10-19
  • VB.NET如何实现数据自增
    这篇文章主要为大家展示了“VB.NET如何实现数据自增”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何实现数据自增”这篇文章吧。VB.NET数据自增的代码如下:Public&nbs...
    99+
    2023-06-17
  • mysql如何实现自动增加
    这篇文章主要介绍“mysql如何实现自动增加”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何实现自动增加”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • MySQL数据库中怎么实现序列自增功能
    MySQL数据库中怎么实现序列自增功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、创建sequence表CREATE TABL...
    99+
    2022-10-18
  • 关于关于序列自增实际应用
        在一些业务表中原本不需要ID字段作为唯一标识,可是在后期为了方便和需求要在数据表中加ID列作为主键或者外键!那么下面总结了两种方式:  &...
    99+
    2022-10-18
  • 如何进行DB2 和SQL Server自增列比较
    如何进行DB2 和SQL Server自增列比较,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。最近由于对SQL Server的自增列理解不够好...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作