精华内容
下载资源
问答
  • Oracle数据库主键自增

    2021-05-13 11:17:48
    在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增。下面我就为大家介绍两种实现主键自增的方法。 两种方法的...

      
    在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增。下面我就为大家介绍两种实现主键自增的方法。

    两种方法的基础都有一个概念就是序列(sequence)的概念,一种是利用序列和显式调用的方式去实现主键自增,另一种是通过序列和触发器(trigger)来实现主键自增。

    /*1.利用序列主键自增*/
    第一步、创建表
           --创建表,主键为ID

           CREATE TABLE YFF (

    ID INT primary key ,

    NAME VARCHAR2(10)

    );

    --创建表的格式

    CREATE TABLE 表名(

    字段名 字段类型(可以加一些约束,例如主键约束),

    字段名 字段类型

    )

    第二步、创建序列
           --创建序列  

           create sequence seq_yff

           start with 1

           increment by 1;

     

           --创建序列的格式

           create sequence 序列名称

    start with 开始数字

    increment by 增长数字

    minvalue 最小值

    maxvalue 最大值

    cycle 是否循环(cycle为循环,nocycle为不循环)

    nocache  不使用缓存

    =======

    Oracle创建序列,删除序列,得到序列的例子

    序列的创建

    create sequence seq_newsId
    increment by 1
    start with 1
    maxvalue 999999999;

    得到序列的SQL语句

    select seq_newsid.nextval from sys.dual;

    删除序列的SQL

       DROP SEQUENCE seq_newsId;

    =======

    关于序列的其他重要操作
           --查询序列(利用nextval查询序列下一次的值)

           select seq_yff.nextval from dual;

          

    --查询序列的格式

           Select 序列名.nextval from dual

           (dual为伪表,当我们不需要从具体的表来取得表中数据,而是单纯地

    得到一些我们想得到的信息,就可以使用伪表)

     

    注意:这里第一次执行这条查询语句得到结果为1,再执行得到2,第一种实现主键自增的方法就是使用序列名.nextval使得值一直增加的

     

           --删除序列()

           DROP SEQUENCE seq_yff;

    注意:序列和表不是连接在一起的,当序列创建之后,用在这个表之后,我将该表删除,但是序列的值还是停留在之前的值上,所以需要注意这个问题

       

    第三步、利用序列+显式化调用 进行自增
     

           insert into YFF values (seq_yff.nextval,'张三');

           insert into YFF values (seq_yff.nextval,'张三');

           select * from YFF;

           

    --2利用序列+触发器调用 进行主键自增     
        此处已经表和序列都用第一种方法中使用过的

          第一步、在表和序列创建好之后,创建触发器

     --创建触发器

          create or replace trigger tri_yff_insert

            before insert on YFF

            referencing old as old new as new

            for each row

          begin

            select seq_yff.nextval

              into :new.ID

              from dual;

          end tri_yff_insert;

       

        --创建触发器格式

    create [or replace] tigger 触发器名

    触发时间 触发事件

    on 表名

        [for each row]

    begin

        pl/sql语句

    end

     

    --解释上面的触发器语句

        create or replace trigger tri_yff_insert    创建触发器并命名

            before insert on YFF              触发时间为向表YFF中插入时

            referencing old as old new as new  

            for each row      对表的每一行触发一次,否则只对整表执行一次

          begin

            select seq_yff.nextval

              into :new.ID

              from dual;

          end tri_yff_insert;

     

    其他对触发器的操作
          --查询表中触发器

          select * from all_triggers WHERE table_name='YFF'

     

           --删除触发器

           drop trigger tri_yff_insert;

          

    第二步、插入数据
           insert into  YFF (ID,Name) values(100,'李四');

           insert into  YFF (Name) values('李四');

           --不管给不给主键赋值,这里触发器都会使得主键值为序列的值

              
    ————————————————

    Oracle中序列(Sequence)详解

    一 序列定义

     

    序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。

    其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。

     

    二 创建序列

     

    创建序列需要CREATE SEQUENCE系统权限。序列的创建语法如下:

      CREATE SEQUENCE 序列名

      [INCREMENT BY n]

      [START WITH n]

      [{MAXVALUE/ MINVALUE n| NOMAXVALUE}]

      [{CYCLE|NOCYCLE}]

      [{CACHE n| NOCACHE}];

        其中:

    1)  INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。

    2)  START WITH 定义序列的初始值(即产生的第一个值),默认为1。

    3)  MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

    4)  MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

    5)  CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

    6)  CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

    大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。

    7)  NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用。

    8)  CURRVAL 中存放序列的当前值,NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效。

     

    例子:

    复制代码

    SQL> create sequence t1_seq increment by 1 start with 1;
    
    SYS@orclasm > drop sequence t1_seq;
    
    
    Sequence dropped.
    
    
    SYS@orclasm > create sequence t1_seq increment by -1 start with  -5;
    
    
    Sequence created.
    
    
    SYS@orclasm > select t1_seq.currval,t1_seq.nextval from dual;
    
    
       CURRVAL    NEXTVAL
    ---------- ----------
            -5         -5
    
    
    SYS@orclasm > select t1_seq.currval,t1_seq.nextval from dual;
    
    
       CURRVAL    NEXTVAL
    ---------- ----------
            -6         -6
    
    
    SYS@orclasm > select t1_seq.currval,t1_seq.nextval from dual;
    
    
       CURRVAL    NEXTVAL
    ---------- ----------
            -7         -7

    复制代码

     

     

    三 使用序列

     

    调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,即用以下方式调用: 序

    列名.NEXTVAL

    CURRVAL用于产生序列的当前值,无论调用多少次都不会产生序列的下一个值。如果序列还

    没有通过调用NEXTVAL产生过序列的下一个值,先引用CURRVAL没有意义。调用CURRVAL

    的方法同上,要指出序列名,即用以下方式调用:序列名.CURRVAL

    复制代码

    SQL> create table t1(id number,qq number,ww number);
    
    SQL> insert into t1 values(t1_seq.nextval,1,1);
    
    1 row created.
    
    SQL> /
    
    1 row created.
    
    SQL> /
    
     
    
    SQL> /
    
    SQL> /
    
    1 row created.
    
     
    
    SQL> select * from t1;
    
     
    
            ID         QQ         WW
    
    ----------     ----------     ----------
    
             1          1          1
    
             2          1          1
    
             3          1          1
    
             4          1          1
    
             5          1          1
    
     
    
    SQL> select t1_seq.currval from dual;
    
     
    
       CURRVAL
    
    ----------
    
             5
    
     
    
    SQL> select t1_seq.nextval from dual;
    
     
    
       NEXTVAL
    
    ----------
    
             6
    
     
    
    SQL> select t1_seq.nextval from dual;
    
     
    
       NEXTVAL
    
    ----------
    
             7

    复制代码

     

     

     

    四 修改序列

     

    修改序列的注意事项:

    1  必须是序列的拥有者或对序列有 ALTER any sequence权限

    2  只有将来的序列值会被改变

    3  改变序列的初始值只能通过删除序列之后重建序列的方法实现

     

    Alter sequence示例:

    ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE -- 到10000后从头开始 NOCACHE ;

     

     可以影响Sequence的初始化参数:

     SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

    复制代码

    SQL> alter sequence t1_seq increment by 2 maxvalue 10 cycle;
    
    alter sequence t1_seq increment by 2 maxvalue 10 cycle
    
    *
    
    ERROR at line 1:
    
    ORA-04013: number to CACHE must be less than one cycle
    
     
    
    SQL> alter sequence t1_seq increment by 2 maxvalue 40 cycle;
    
    Sequence altered.
    
     
    
    SQL> insert into t1 values(t1_seq.nextval,1,1);
    
    /
    
    /
    
    ……….
    
    /
    
    SQL> select * from t1;
    
            ID         QQ         WW
    
    ----------     ----------     ----------
    
             1          1          1
    
             2          1          1
    
             3          1          1
    
             4          1          1
    
             5          1          1
    
             9          1          1
    
            11          1          1
    
            13          1          1
    
            15          1          1
    
            17          1          1
    
           ………………………………………………..
    
            37          1          1
    
            39          1          1
    
             1          1          1
    
             3          1          1
    
             5          1          1
    
     
    
    24 rows selected.

    复制代码

     

     

     

    五 查询序列

     

    1  通过数据字典USER_OBJECTS可以查看用户拥有的序列。

    2  通过数据字典USER_SEQUENCES可以查看序列的设置。

      例:查看用户的序列:

    SELECT SEQUENCE_NAME,MIN_VALUE,MAX_VALUE,INCREMENT_BY,LAST_NUMBER FROM USER_SEQUENCES;

     

      执行结果:

      

    SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER
    
     

     

    复制代码

    SQL> select object_name,object_type from user_objects;
    
     
    
    OBJECT_NAM   OBJECT_TYPE
    
    ----------        -------------------
    
    T1_SEQ        SEQUENCE
    
    T1            TABLE
    
     
    
    SQL> select sequence_name,increment_by,cycle_flag,cache_size from user_sequences;
    
    SEQUENCE_N  INCREMENT_BY  CYCLE_FLAG   CACHE_SIZE
    
    ----------         ------------       ----------       ----------
    
    T1_SEQ            2             Y            20

    复制代码

     

     

    六 删除序列

     

    SQL> drop sequence t1_seq;

     

     


     



    序列作为主键使用的原理、优缺点讨论 

    这几天和同事一直在讨论关于表设计中主键选择的问题,用sequence作为主键究竟有什么好处,又有什么缺点,尤其是有些事务场景上下文需要用到创建的序列值,如何用?其实我想说的是,可能只是一个很简单的概念,可能深入理解,还是有很多未知的知识,当然也就可能会有一些容易忽略但又可能很关键的坑,只有碰了才知道。。。
    以下是总结摘要,如有疏漏,还请过路的各位大侠赐教。

     

     

    1、首先说下seq.nextval主要有以下两种使用场景:
    (1). 如果一个事务中只是INSERT时需要序列,其他地方不会需要这个序列,那么只需要在INSERT ... VALUES (seq.nextval ...)语句中使用即可。
    (2). 如果一个事务中INSERT一张表后,还需要插入时的主键ID值,作为外键插入其他表,那么就需要在INSERT第一张表前使用select seq.nextval from dual提前获取可用的ID保存到一个变量中,为后面使用。


    2、其次可以简单说下调用序列的原理,只有理解了序列的原理,才能有助于我们知道如何正确使用序列。
    使用序列时Oracle内部大体是按照如下步骤进行:
    (1). 一个序列会被定义到Oracle内部的一张数据字典表(seq$)的一行。
    (2). 第一次使用序列,序列的起始值会加上缓存大小,然后更新回行。
    (3). Oracle内部会自动跟踪内存中的两个值,当前值和目标值。
    (4). 每次有回话调用seq.nextval,Oracle会递增当前值,然后检查是否超过了目标值,再返回结果。
    (5). 如果当前值和目标值相同,Oracle会更新数据字典表中的行,为目标值加上缓存大小,同时内存中产生了一个新的目标值。
    例如create sequence seq cache 20;这样一序列。名称为seq的序列,缓存大小是20,默认初始值是1,步长默认是1。

    当使用了一次seq.nextval后,可以看HIGHWATER字段值为21,即目标值1+缓存大小20=21。

    当执行20次后,seq.nextval值变为21,此时HIGHWATER字段值是41,即目标值21+缓存大小20=41。

    也就是每调用seq.nextval值20次,会更新一次seq$表,那么问题来了,如果cache值较小,且序列使用的频率较高,那么会对seq$表有频繁的更新操作,日志量会增加,尤其在RAC下,更新该行的时候,该数据块会在节点间不停的传送,就会产生可能的争用,这种问题会被放大。因此为了减少这种情况,我们可以将cache缓存值设置大一些,例如1000,减少对字典表的更新。
    序列还有一个问题,就是cache缓存是实例级的,对于RAC,比如第一个节点使用序列时会分配1-20,第二个节点会被分配21-40,Oracle保证不会重复,但若节点crash了,比如节点1坏了,那么序列就会出现断号,节点1再次使用时,只会从41-60,由于我们用主键只为了标示唯一,不关心段号,也不关心产生的顺序,所以这些可以忽略。

     

    :最近在讨论某系统和一个外系统做全局事务的事情,本想用这个主键作为两系统传输的一部分,用于控制全局事务,且用其作为判断交易先后顺序的依据,这是不太符合要求的,因为是RAC,序列是基于实例级cache,那么如果不能保证某一类型的交易总在一个节点上执行,那么不同次交易产生的主键序列值可能不是递增的,例如节点1处理一次交易,产生序列是1,节点2处理一次交易,产生序列是21,此时节点1再处理一次交易,产生序列是2;除非设置序列为order,但这样在RAC就有可能产生资源争用的问题,因为为了保证多节点间每次产生的序列值是递增的,每次产生就需要多节点间判断当前值后,才能知道下一个值是多少,而且会有额外的锁,保证同一时间只有一个节点在做这个操作,当然究竟是否会产生资源争用,还是要依据实际的业务并发量,或者压力测试才能证明,这里只是说可能会这样的问题,不是一定会,否则Oracle就不会有提供这种order的创建属性,凡事不绝对。


    3、结合(1)的场景,
    (1). 如果一个事务中只是INSERT时需要序列,其他地方不会需要这个序列,那么只需要在INSERT ... VALUES (seq.nextval ...)语句中使用即可。
    > 这个场景下,如果序列cache设置为1000,调用100次nextval几乎没有影响。

    (2). 如果一个事务中INSERT一张表后,还需要插入时的主键ID值,作为外键插入其他表,那么就需要在INSERT第一张表前使用select seq.nextval from dual提前获取可用的ID保存到一个变量中,为后面使用。
    > 这个场景,就有些说的了。如果是同一事务中需要用到之前的序列值,那么就需要提前用select seq.nextval from dual保存到变量中,(当然,如果是用PLSQL语句,则可以不用提前保存变量这步,但咱们的应用中不适用,就不多说了)。

    展开全文
  • oracle设置主键自增

    千次阅读 2018-11-13 09:35:40
    最近写一个简单的功能,根据以往的是身份证被设置为唯一标识,但也不是所有的都是如此,假如表里有id的情况下,你想把它设为主键自增该怎么样呢,oracle中,设置一个序列并且创建一个触发器就可以了。 --设置主键...

    最近写一个简单的功能,根据以往的是身份证被设置为唯一标识,但也不是所有的都是如此,假如表里有id的情况下,你想把它设为主键并自增该怎么样呢,oracle中,设置一个序列并且创建一个触发器就可以了。

    --设置主键以及主键自增长--
    --如果是对于已经建好的表,想增加主键约束,则类似语法:alter table test add constraint pk_id primary key(id); 

    --主键自增1创建序列--
      create sequence SEQ_TEST
     
        minvalue 1        --最小值
        nomaxvalue        --不设置最大值
        start with 1      --从1开始计数
        increment by 1    --每次加1个
        nocycle           --一直累加,不循环
        nocache;         --不建缓冲区

       
      --触发器--
    CREATE OR REPLACE TRIGGER tg_test
    BEFORE INSERT ON  motorman FOR EACH ROW WHEN (new.driverid is null)
    begin
    select seq_test.nextval into:new.driverid from dual;
    end;

     

    select * from motorman ;

    insert into motorman(driverid,sex) values(6,'男')
    insert into motorman (drivername,sex)values('小滴','女');

     

    ok

     

    展开全文
  • oracle怎么实现id自增设置主键

    千次阅读 2020-12-22 09:19:16
    展开全部可以使用序列实现id自增主键语法为primary key。当一个序列第一62616964757a686964616fe4b893e5b19e31333366306434次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的...

    展开全部

    可以使用序列实现id自增,主键的语法为primary key。

    当一个序列第一62616964757a686964616fe4b893e5b19e31333366306434次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。

    创建序列语法如下:create sequence [模式]序列名称[start with 起始数字] [increment by 增量][maxvalue 最大值|nomaxvalue][minvalue 最小值|nominva lue][cycle|nocuyle][cache 数目|nocache][order|noorder]。

    具体代码示例如下:

    创建表

    create table book(

    bookId varchar2(4) primary key,

    name varchar2(20)

    );

    创建序列

    create sequence book_seq start with 1 increment by 1;

    创建触发器

    create or replace trigger book_trigger

    before insert on book

    for each row

    begin

    select book_seq.nextval into :new.bookId from dual;

    end ;

    添加数据

    insert into book(name)  values ('cc');

    insert into book(name)  values ('dd');

    commit;

    扩展资料:

    在数据表中,有时候需要主键值自动增加,但在Oracle数据库中,没有象Mysql的Autoincrement一样自动增长的数据类型。在实现Oracle数据库字段自增功能时,利用DML触发器来完成。

    触发器(trigger)是一些过程,当发生一个特定的数据库事件时就执行这些过程,可以使用触发器扩充引用的完整性。DML即数据操纵语言,用于让用户或程序员使用,实现对数据库中数据的操作。基本的数据操作分成两类四种:检索(查询)和更新(插入、删除、修改)。

    触发器类似于函数和过程,其在数据库中以独立身分存在。触发事件可以是对数据库表的DML(insert、update或delete)操作等。

    展开全文
  • 利用序列产生主键值。...序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每...

    转载:https://blog.csdn.net/java3344520/article/details/4907591 

    利用序列产生主键值。 

    序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。 
    创建序列语法如下:create sequence [模式]序列名称[start with 起始数字] [increment by 增量][maxvalue 最大值|nomaxvalue][minvalue 最小值|nominva lue][cycle|nocuyle][cache 数目|nocache][order|noorder]。 

    通过序列起始数字、最大值、最小值和增量值可以确定序列是增序还是减序,每次增或减的多少。Nocyle选项用于确定在序列达到最大值(增序列)或最小值(减序列)之后不能再产生更多的值,用以防止序列回转。 

    在Oracle数据库中创建序列,在使用sql语句向数据库中写入数据的时候,利用序列产生的唯一值,实现表中主键值自增。例如: 

    SQL>create table tablename    
      
        (id number notnull,…);
      
           
    SQL >create sequence autoID increment by 1 start with 1 maxvalue 999999 cycle;  
      
         
    SQL >insert into tablename values(autoID.nextval,...); 
    多个用户可以共用一个序列,但它是针对所有的表,因此产生的序号对一个表而言产生的主键值唯一但是不连续。 

    使用触发器产生主键值。 

    在数据表中,有时候需要主键值自动增加,但在Oracle数据库中,没有象Mysql的Autoincrement一样自动增长的数据类型。在实现Oracle数据库字段自增功能时,利用DML触发器来完成。 

    触发器(trigger)是一些过程,当发生一个特定的数据库事件时就执行这些过程,可以使用触发器扩充引用的完整性。DML即数据操纵语言,用于让用户或程序员使用,实现对数据库中数据的操作。基本的数据操作分成两类四种:检索(查询)和更新(插入、删除、修改)。触发器类似于函数和过程,其在数据库中以独立身分存在。触发事件可以是对数据库表的DML(insert、update或delete)操作等。DML触发器是目前最广泛使用的一种触发器,即由DML语句激发的触发器,并有该语句决定DML触发器的类型。其触发事件包括insert(插入)、update(更新)和delete(删除)。无论哪种触发事件,都能为每种触发事件创建before触发器和after触发器。如可以在表上建立一个before insert 语句,表示在insert事件发生之前采取行动。 

    创建触发器的语法如下:

    create[or replace]trigger 触发器名称    
      
    {before|after|instead of}激发触发事件    
      
    referencing_clause    
      
    [WHEN trigger_condition]    
      
    [FOR EACH ROW]   
    referencing_clause用来引用正在处于修改状态下的行中的数据,如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。利用触发器与序列相结合,可以实现在进行DML操作的时候,使表中主键值自动增加。其实现步骤可参照如下例子。


    drop table book;   
    --创建表      
    create table book(       
       bookId varchar2(4) primary key,   
       name varchar2(20)         
    );   
    --创建序列      
    create sequence book_seq start with 1 increment by 1;    
      
    --创建触发器      
    create or replace trigger book_trigger       
    before insert on book       
    for each row       
    begin       
    select book_seq.nextval into :new.bookId from dual;      
    end ;   
    --添加数据      
    insert into book(name)  values ('cc');    
    insert into book(name)  values ('dd');   
      
    commit;  

    查询数据:select * from book; 

    当需要对book数据库表中的主键值进行写值时,便可以使用sql语句利用序列+触发器实现主键值自动增加.


    转载:oracle什么时候需要commit

     

    今天在oracle的SQL plus 中执行了删除和查询操作,然后在PL/SQL中也执行查询操作,语句一样,结果却不一样,让我大感郁闷,后来才突然想到可能是两边数据不一致造成的,但是为什么不一致呢,就是没用commit,

    在网上查了一下,大概是这样说的:

    DML语言,比如update,delete,insert等修改表中数据的需要commit;
    DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit);

     

    DDL 数据定义语言:
    create table 创建表   
    alter table 修改表   
    drop table 删除表   
    truncate table 删除表中所有行   
    create index 创建索引   
    drop index 删除索引
    当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create
    table),此时来自insert命令的数据将被提交到数据库。当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。

    DML 数据操作语言:
    insert 将记录插入到数据库  
    update 修改数据库的记录  
    delete 删除数据库的记录
    当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动
    发出commit命令,使未提交的DML命令提交。

     

     

     

     

    展开全文
  • oracle实现id自增设置主键

    千次阅读 2016-07-15 15:53:21
    1、关于主键:在建表时指定primary key字句即可: create table test( ...如果是对于已经建好的表,想增加主键约束,则类似语法: alter table test add constraint pk_id primary key(id);
  • mysql设置主键自增

    2021-02-02 04:02:23
    @GeneratedValue(strategy = GenerationType.IDENTITY) 根据底层数据库自动选择方式,需要底层数据库的设置 如 MySQL,会使用自增字段,需要将主键设置成 auto_increment......(8,2) 中文含义 存款流水号 客户标识 银行...
  • Oracle没有自增主键这么一说,我们需要建立一个索引然后再设置一个触发器来添加自增主键。 创建一张表 create table t_( user_id number not null primary key, user_name varchar2(30), credits number, user_...
  • Oracle实现主键自增

    2019-01-23 10:04:14
    Oracle实现主键自增 因为oracle不存在mysql 的自增方法auto_increment,所以在Oracle中要实现字段的自增需要使用序列和触发器来实现字段的自增。关于oracle的安装和卸载可以看我上一篇文章。 第一步:创建序列 语法...
  • oracle序列与自增主键

    千次阅读 2018-04-03 20:40:46
    oracle并不像mysql那样提供了自增主键oracle自增主键需要通过序列实现。创建序列的语法为CREATR SEQUENCE 序列名称 [INCREMENT BY n] --步长,默认是1[START WITH n] --从几开始,默认是1[MAXVALUE m/MINVALUE ...
  • 由于在oracle中主键自增比mysql麻烦一点,需要创建触发器才可以,接下来就是让oracle主键自增的过程 1;/第一步:创建表格/ create table XTY_DOMAIN_CDN_IP_201909( id int primary key, --主键,自增长 url varc.....
  • pgsql 建表主键自增

    万次阅读 2019-09-11 19:50:57
    使用navicat创建postgresql数据库的表时如何设定主键自增? 我们知道,在navicat中MySQL 里面有auto_increment 自增字段PostgreSQL 没有自增字段这一说法,但是有单独的对象:序列。 可以用序列或者其他方法来是实现...
  • 1:使用主键最大值加1;(只适合在开发使用) 2:使用sequences序列:(推荐) Sequences序列:有两个属性,当前值(currval)和下一个值(nextval),默认是从1开始,每次加1。 例:select food_sec.Currval...
  • ORACLE设置主键自增

    千次阅读 2018-07-23 15:41:08
    --创建表 create table BJ_ZR_...idNumber number primary key, --主键、自增长 gasName NVARCHAR2(100) not null, gasRatio NUMBER(10,2) not null, salesDate DATE ); --创建序列 CREATE SEQUENCE lng...
  • oracle序列详解和建立自增主键cssOracle序列主键序列: 是oacle提供的用于产生一系列惟一数字的数据库对象。l 自动提供惟一的数值l 共享对象l 主要用于提供主键值l 将序列值装入内存能够提升访问效率web1.首先建立...
  • 序列: 是oacle提供的用于产生一系列唯一数字的数据库对象。...首先创建序列,Oracle序列的语法格式为:CREATE SEQUENCE 序列名[INCREMENT BY n][START WITH n][{MAXVALUE/ MINVALUEn|NOMAXVALUE}][{CYCLE|NOCYCLE}...
  • 序列+触发器实现Oracle主键自增序列的语法格式为:CREATESEQUENCE 序列名[INCREMENT BY n][START WITH n][{MAXVALUE/MINVALUE n|NOMAXVALUE}][{CYCLE|NOCYCLE}][{CACHE n|NOCACHE}];INCREMENT BY用于定义序列的步长...
  • 1.前言   最近做一个批量导入影像的需求,将多条记录批量插入数据库中。...数据库用的是Oracle,于是带着需求开始码代码。 2.MyBatis+MySQL实现批量插入数据的做法 <insert id="...
  • oracle实现主键自增创建Sequence的语句:触发器的语法 创建Sequence的语句: create sequence MY_SEQ increment by 1 start with 1 nomaxvalue nocycle; 相关参数说明: MY_SEQ --创建的序列的名称 INCREMENT BY 1...
  • oracle创建两个关联的表并设置主键自增 1.注意点 注意点 .删除stu表中所有的记录 -- 删除记录语法: delete from 表名 [where条件] delete from stu; -- 不会删除自增变量的值 -- 仅删除符合条件的 delete from ...
  • 其中实现主键自增时两者就完全不同,有细心的朋友就会发现在Oracle数据库中我们使用AUTO_INCREMENT会报错,那么,我们就应该接触到另外一个知识,序列。 一.序列 1.序列定义 序列(SEQUENCE)是序列号生成器,可以为表...
  • Oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。1、Create Sequence你首先要有create sequence或者create any sequence权限Sql代码CREATE SEQUENCE SEQ_...
  • 因为Oracle中没有自增主键配置,所以如果要使用,需要配置触发器。以下为触发器的新建语法。 create or replace trigger server_tri before insert on server for each row declare begin SELECT server_seq.Nextval...
  • 过创建Oracle序列和触发器实现表的主键自增。 首先创建Oracle序列,序列的语法格式为: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/MINVALUE n|NOMAXVALUE...
  • [转]在oracle下触发器实现主键自增

    万次阅读 多人点赞 2009-11-30 18:11:00
    序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量...
  • oracle序列详解和创建自增主键Oracle序列主键序列: 是oacle提供的用于产生一系列唯一数字的数据库对象。l 自动提供唯一的数值l 共享对象l 主要用于提供主键值l 将序列值装入内存可以提高访问效率1.首先创建序列,...
  • 呵呵,这个问题,是从其他数据库转过来的开发者最常见的问题。 1、关于主键:在建表时指定primary key字句即可: ...如果是对于已经建好的表,想增加主键约束,则类似语法: alter table test add constraint pk_
  • 小知识点:dual是一个伪表,是一张只有一个字段,一行记录的表。不需要从具体的表来...--1、创建序列create sequence seq_testincrement by 1-- 每次加几个start with 1-- 从1开始计数nomaxvalue-- 不设置最大值no...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,226
精华内容 4,090
关键字:

oracle设置主键自增语法