• ORACLE主键ID生成

    2018-10-28 20:29:08
    一般常用的方法有两种,使用Sequence和使用SYS_GUID();   方法一 使用序列号: 创建序列号 create sequence SEQ_T...insert id="save" parameterType="edu.mvcdemo.entity.User">...

    一般常用的方法有两种,使用Sequence和使用SYS_GUID();

     

    方法一  使用序列号:

    创建序列号

    create sequence SEQ_T_USER
    start with 1
    increment by 1
    nocache;

    再使用序列号

    	<insert id="save" parameterType="edu.mvcdemo.entity.User">
    	    <selectKey resultType="java.lang.Long"  order="BEFORE" keyProperty="id">
    	        SELECT SEQ_T_USER.NEXTVAL AS VALUE FROM DUAL
    	    </selectKey>
    	    <![CDATA[  
    	        INSERT INTO T_USER(
    	            ID,
    	            USERNAME,
    	            PASSWORD,
    	            IS_VALID
    	        ) VALUES (
    	            #{id},
    	            #{userName},
    	            #{password},
    	            #{isValid}
    	        )
    	    ]]>   
    	</insert>

    方法二  使用SYS_GUID():

    create table T_XX(
       ID             VARCHAR2(32) DEFAULT RAWTOHEX(SYS_GUID())
    );

     

    展开全文
  • Oracle数据库—主键ID生成不重复的字符串函数sys_guid() 今天准备压测服务器,准备生成10W条数据,但是主键ID要Oracle数据库自动生成。 在oracle8i以后提供了一个生成不重复的数据的一个函数sys_guid()一共32位,...

    Oracle数据库—主键ID生成不重复的字符串函数sys_guid()

    今天准备压测服务器,准备生成10W条数据,但是主键ID要Oracle数据库自动生成。

    在oracle8i以后提供了一个生成不重复的数据的一个函数sys_guid()一共32位,生成的依据主要是时间和机器码,具有世界唯一性,类似于java中的UUID(都是世界唯一的)。

    其应用场景:当数据库某字段设置为唯一,则可自动生成(比如主键);

    获取方式 select sys_guid() from dual ;

    示例:
    INSERT INTO “YG_IS”.“VIP_ACTUALSTORAGE_DETAIL” (“ID”, “STORAGENO”, “BARCODE”, “PONO”, “AMOUNT”, “ACTUALAMOUNT”, “RETURNAMOUNT”, “DIFFERAMOUNT”, “CREATETIME”) VALUES (sys_guid(), ‘2017031009-088’, ‘AF2U1345DU1AQ6230’, ‘2100118353’, ‘1’, ‘1’, ‘0’, ‘0’, TO_DATE(‘2017-03-14 16:45:27’, ‘SYYYY-MM-DD HH24:MI:SS’));

    效果:
    在这里插入图片描述

    展开全文
  • 有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。 一、自增长主键 --首先建一个表TEST create table TEST (  NID int PRIMARY KEY,  test1 varchar2(20),  test2 varchar2(20),  ...

    有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。

    一、自增长主键

    --首先建一个表TEST

    create table TEST
    (
      NID int PRIMARY KEY,
      test1 varchar2(20),
      test2 varchar2(20),
      test3 varchar2(20),
      test4 varchar2(20),
      test5 varchar2(20)
    )

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

    以上代码完成了一个序列(sequence)的建立过程,名称为SEQ_TEST,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!)
    你只有了表和序列还不够,最好再建一个触发器来执行它!代码如下:

    CREATE OR REPLACE TRIGGER tg_test
    BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)
    begin
    select seq_test.nextval into:new.nid from dual;
    end;

     

    下面是测试

    select * from test
    insert into test(nid,test1) values(6,'aaa')
    insert into test(test1) values('bbb') 

    二、唯一序列

            SYS_GUID() 生成32位的唯一编码。

            序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
      此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。

            很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。

            使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。

            SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。

    展开全文
  • oracle主键生成策略

    2018-07-23 14:52:14
    创建序列   创建序列  语法 CREATE SEQUENCE 序列名 [相关参数] 参数说明 INCREMENT BY :序列...(默认不限制最大值,NOMAXVALUE) MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE) CYCLE...

    创建序列

     

    • 创建序列 
      • 语法 CREATE SEQUENCE 序列名 [相关参数]
      • 参数说明 
        INCREMENT BY :序列变化的步进,负值表示递减。(默认1) 
        START WITH:序列的初始值 。(默认1) 
        MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE) 
        MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE) 
        CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。 
        CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
      • 例 
        CREATE SEQUENCE SEQ_DEMO 
        INCREMENT BY 1 
        START WITH 1 
        NOMAXvalue 
        NOCYCLE 
        NOCACHE;

    • 修改、删除序列 
      • 使用 alter 命令进行修改
      • 使用 drop 命令删除

    例子:

    CREATE SEQUENCE SEQ_AREA_ROUTE_CONFIG_ID  --序列名
    INCREMENT BY 1   -- 每次加几个  
    START WITH 1       -- 从1开始计数  
    NOMAXVALUE        -- 不设置最大值  
    NOCYCLE               -- 一直累加,不循环  

    CACHE 10;

    创建一个序列,每次插入之前查询得到当前序列最大值

    展开全文
  • 前提:使用oracle10g 现在有两个表:dept 和 student dept包括 id length=2(专业编号),name(专业名称) student包括 id length=6(学生编号), name(学生名称), sex(性别) 要求: student 的 id 由...
  • Oracle数据库采用那种主键生成策略 1、自动增长identity: 适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能...

    Oracle数据库采用那种主键生成策略

    1、自动增长identity:

    适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识

    使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)

    数据库中的语法如下:

     

     

    view plaincopy to clipboardprint?

    01.MySQL:create tablet_user(id int auto_increment primary key, name varchar(20)); 

    02.SQL Server:create tablet_user(id int identity(1,1) primary key, name varchar(20)); 

    03. 

    04.<id name="id"column="id" type="long"> 

    05.   <generator class="identity" /> 

    06.</id> 

    MySQL:create tablet_user(id int auto_increment primary key, name varchar(20));

    SQL Server:create tablet_user(id int identity(1,1) primary key, name varchar(20));

     

    <id name="id"column="id" type="long">

       <generator class="identity" />

    </id>

     

    2、sequence:

    DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识

    数据库中的语法如下:

     

     

    view plaincopy to clipboardprint?

    01.Oracle:create sequenceseq_name increment by 1 start with 1; 

    Oracle:create sequenceseq_name increment by 1 start with 1;

     

    需要主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每次取到的值唯一,如:

     

     

    view plaincopy to clipboardprint?

    01.insert into tbl_name(id, name)values(seq_name.nextval, ‘Jimliu’); 

    02. 

    03.<id name="id"column="id" type="long"> 

    04.   <generator class="sequence"> 

    05.      <param name="sequence">seq_name</param> 

    06.  </generator> 

    07.</id> 

    insert into tbl_name(id, name)values(seq_name.nextval, ‘Jimliu’);

     

    <id name="id"column="id" type="long">

       <generator class="sequence">

          <param name="sequence">seq_name</param>

      </generator>

    </id>

     

    如果我们没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence

    此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator

    调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:

     

    view plaincopy to clipboardprint?

    01.<param  name="sequence">NAME_SEQ</param>(Oracle中很常用) 

     <param  name="sequence">NAME_SEQ</param>(Oracle中很常用)

     

    3、hilo:

    使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。它将id的产生源分成两部分,DB+内存,然后按照算法结合在一起产生id值,可以在很少的连接次数内产生多条记录,提高效率

     

     

    view plaincopy to clipboardprint?

    01.MySQL:create tablehi_value(next_hi integer not null); 

    MySQL:create table hi_value(next_hiinteger not null);

     

     

     

    view plaincopy to clipboardprint?

    01.insert into hi_value(next_hi)values(1); 

    02. 

    03.<id name="id"column="id"> 

    04.   <generator class="hilo"> 

    05.      <param name="table">hi_value</param> 

    06.      <param name="column">next_hi</param> 

    07.      <param name="max_lo">100</param> 

    08.  </generator> 

    09.</id> 

    insert into hi_value(next_hi) values(1);

     

    <id name="id"column="id">

       <generator class="hilo">

          <param name="table">hi_value</param>

          <param name="column">next_hi</param>

          <param name="max_lo">100</param>

      </generator>

    </id>

     

    在hibernate持久化的时候,由hibernate负责生成低位值。hilo标识符生成器在生成标识符时需要从hi_value表中取出next_hi的当前值,然后修改该值,这个操作是在单独的事务中完成的。最大的低值在属性max_lo中配置,但在Hibernate内存中生成的低位值超过此值时,就有需要到数据库的hi_value表中再次读取高位值了。

    使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)

         我们也可以自己设置自定义的表名和字段名

     

     

    view plaincopy to clipboardprint?

    01.<id name="id"type="integer"> 

    02.  <column name="id"/> 

    03.  <generator class="hilo"> 

    04.     <param name="my_unique_key"/> 

    05.     <param column="next_hi"/> 

    06.  </generator> 

    07.</id>  

    <id name="id"type="integer">

      <column name="id"/>

      <generator class="hilo">

         <param name="my_unique_key"/>

         <param column="next_hi"/>

      </generator>

    </id> 

     

    4、native:

    会根据底层数据库的能力,从identity、sequence、hilo中选择一个,灵活性更强,但此时,如果选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高

         对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)

     

    view plaincopy to clipboardprint?

    01.<id name="id"column="id"> 

    02.   <generator class="native" /> 

    03.</id> 

    <id name="id"column="id">

       <generator class="native" />

    </id>

     

    5、seqhilo:

    sequence和hilo的结合,hilo的高位由sequence产生,所以也需要底层数据库的支持

    通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用)

     

    view plaincopy to clipboardprint?

    01.<id name="id"column="id"> 

    02.  <generator class="seqhilo"> 

    03.     <param name="sequence">seq_name</param> 

    04.     <param name="max_lo">100</param> 

    05.  </generator> 

    06.</id> 

    <id name="id"column="id">

      <generator class="seqhilo">

         <param name="sequence">seq_name</param>

         <param name="max_lo">100</param>

      </generator>

    </id>

     

    6、increment:

    这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只

     

    能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法

     

     

    view plaincopy to clipboardprint?

    01.<id name="id"column="id"> 

    02.   <generator class="increment" /> 

    03.</id> 

    <id name="id"column="id">

       <generator class="increment" />

    </id>

     

    7、uuid.hex:

    使用一个128-bit的UUID算法生成字符串类型的标识符,UUID被编码成一个32位16进制数字的字符串。UUID包含:IP地址、JVM启动时间、系统时间(精确到1/4秒)和一

     

    个计数器值(JVM中唯一)

    hibernate会算出一个128位的唯一值插入

     

    view plaincopy to clipboardprint?

    01.<id name="id"column="id"> 

    02.   <generator class="uuid.hex" /> 

    03.</id> 

    <id name="id"column="id">

       <generator class="uuid.hex" />

    </id>

     

    uuid.string

          hibernate会算出一个16位的值插入

     

     

    8、assigned:

    由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况,如:

     

    view plaincopy to clipboardprint?

    01.<id name="id"column="id" type="string"> 

    02.   <generator class="assigned" /> 

    03.</id> 

    <id name="id"column="id" type="string">

       <generator class="assigned" />

    </id>

     

    这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键(surrogate key),不应使用自然主键(natural key具有业务含义),在没有指定<generator>标签时,

     

    默认就是assigned主键的生成方式

    在插入数据的时候主键由用户自己添加,hibernate也不管

     

     

    9、foreign

           使用外部表的字段作为主键

     

    10、select

           使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)

     

     

    此外,有些表没有代理主键,使用联合主键,多个字段唯一,这也是不建议的表设计,

    展开全文
  • -- 调用:SELECT FUN_GET_TABLE_ID('TEST','ID','A',23) FROM DUAL CREATE OR REPLACE FUNCTION FUN_GET_TABLE_ID(IN_TABLE_NAME VARCHAR2, IN_COLUMN_NAME VARCHAR2, ...
  • select rownum as mynum from dual connect by level <=100
  • Oracle数据表创建规则

    2018-07-03 09:50:09
    写在前边:规范是一种习惯,在Oracle数据库中笔者认为表中的字段命名规范需要引起注意,当考虑使用SSM作为框架的时候,Mybatis 的逆向工程能够根据数据库表名和数据库名字段名自动生成pojo类,其中pojo类中的属性...
  • 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 不能有单点故障。 以时间为序,或者ID里包含时间。这样一是可以少一个索引,...
  • create sequence TEST_IDminvalue 1maxvalue 9999999start with 1increment by 1nocache; ORACLE的编号和SQL SERVER的不同。SQL SERVER可以设置一个值为自增。 ORACLE需要先建立一个SEQUENCE...例如,若想生成这样的编
  • 分布式,高并发下id生成要求 全局唯一 趋势递增 效率高(生成.使用.索引) 控制并发 一 . Uuid(uuid/guid[通用唯一识别码]) Uuid是按照开放软件基金会(osf)制定的标准计算 用到了以太网开地址(MAC),纳米级时间,芯片id...
  • 除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id。 百度了不少php相关的生成方式,得到的大多是随机字符串和内置的 uniqid()函数。不过经过 ab 测试,...
  • Oracle中实现自增ID

    2019-05-21 18:35:01
    oracle实现自增id 1.创建一张T_StudentInfo表 create table T_StudentInfo ( "id" integer not null primary key, xsName nvarchar2(120) not null, xsAge integer not null, Mobile varc...
  • 我们将向OE.ORDERS表中插入10万行数据,这10万行数据是随机生成的 DECLARE order_id INT; customer_id INT; ORDER_MODE VARCHAR(10); ORDER_TOTAL NUMBER(10,2); ORDER_STATUS INT; BEGIN SELECT MAX(order_id...
  • oracle生成随机数函数

    2019-01-24 21:21:35
    CREATE OR REPLACE  FUNCTION createUniqueKey(str_begin in VARCHAR2,str_date in VARCHAR2,date_date in date ,str_date_format in VARCHAR2,bool_is_timestamp in char,int_random_length in int) ...
  • Oracle自定义编码规则

    2013-12-25 11:44:01
    Oracle自定义编码规则的实现 在编写程序的过程中,我们经常会用到对一些记录进行编码的实现,有时候定义的编码规则并不能很好的实现需求,比如使用lpad(rpad)函数进行补充的时候,有个长度的限制,这时候就影响了...
  • 以新生成学生管理模板为例,首先在数据库中创建chengji表,当然你会想到学号,你会想到用默认的id但是这里注意要把id类型换成varchar,不然的话你定的学号是不会出现在你的页面上的,自然而然也就不会添加成学号,...
  • 用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例。...生成规则:2位前缀+年月日+5位流水号 或者 2位前缀+年月日时分+5位流水号 或者 2位前缀+年月日时分秒+5位流水号。 测试订单表(t
  • Oracle中ROWID详解

    2018-03-09 10:39:48
    oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来访问数据的。rowid需要 10个字节的存储空间,并用18个字符来显示。该值表明了该行在oracle数据库中的物理具体...
1 2 3 4 5 ... 20
收藏数 36,560
精华内容 14,624