做视频网站 买带宽,百度云 做视频网站,众筹插件+wordpress,做白酒用哪个分类信息网站如果你经常使用 MySQL#xff0c;你肯定对 AUTO_INCREMENT 非常熟悉#xff0c;因为经常要用到它。一、什么是自增列 #xff1f;自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段#xff0c;这样每次增加一行时#xff0c;不用指该字段的值你肯定对 AUTO_INCREMENT 非常熟悉因为经常要用到它。一、什么是自增列 自增列是数据库中值随插入的每个行自动增加的一列。它最常用于主键或 ID 字段这样每次增加一行时不用指该字段的值它就会自动增加而且是唯一的。当在 MySQL 中定义列时我们可以指定一个名为 AUTO_INCREMENT 的参数。然后每当将新值插入此表中时放入此列的值比最后一个值加 1。但很不幸Oracle 没有 AUTO_INCREMENT 功能。 那要如何在Oracle中做到这一点呢二、在 Oracle 11g 中设置自增字段1. 创建表首先创建一张用于测试的表CREATE TABLE TEST (ID NUMBER(11) PRIMARY KEY,NAME VARCHAR2(50BYTE) NOT NULL);2. 创建序列然后创建一个名为 TEST_ID_SEQ 的序列(序列名称自己随意设定)CREATE SEQUENCE TEST_ID_SEQINCREMENT BY 1START WITH 100MAXVALUE 999999999NOCYCLENOCACHE;如果要删除序列可以使用下面的 SQL 命令DROP SEQUENCE TEST_ID_SEQ;对 SEQUENCE 的一些说明INCREMENT BY 用于指定序列增量(默认值1)如果指定的是正整数则序列号自动递增如果指定的是负数则自动递减。START WITH 用于指定序列生成器生成的第一个序列号当序列号顺序递增时默认值为序列号的最小值当序列号顺序递减时默认值为序列号的最大值。MAXVALUE 用于指定序列生成器可以生成的组大序列号(必须大于或等于 START WITH并且必须大于 MINVALUE)默认为 NOMAXVALUE。MINVALUE 用于指定序列生成器可以生成的最小序列号(必须小于或等于 START WITH并且必须小于 MAXVALUE)默认值为 NOMINVALUE。CYCLE 用于指定在达到序列的最大值或最小值之后是否继续生成序列号默认为 NOCYCLE。CACHE 用于指定在内存中可以预分配的序列号个数(默认值20)。到这一步其实就已经可以实现字段自增只要插入的时候将 ID 的值设置为序列的下一个值 TEST_ID_SEQ.NEXTVAL 就可以了SQL INSERT INTO TEST (ID, NAME) VALUES (TEST_ID_SEQ.NEXTVAL, name1);SQL INSERT INTO TEST (ID, NAME) VALUES (TEST_ID_SEQ.NEXTVAL, name2);SQL INSERT INTO TEST (ID, NAME) VALUES (TEST_ID_SEQ.NEXTVAL, name3);SQL SELECT * FROM TEST;ID NAME--- ------100name1101name2102name3为了简化插入操作我们还可以创建一个触发器当将数据插入到 “TEST” 表的时候自动将最新的 ID 插入进去。3. 创建触发器CREATE OR REPLACE TRIGGER TEST_ID_SEQ_TRGBEFORE INSERT ON TESTFOR EACH ROWWHEN (NEW.ID IS NULL)BEGINSELECT TEST_ID_SEQ.NEXTVALINTO :NEW.IDFROM DUAL;END;这样的话每次写插入语句只需要将 ID 字段的值设置为 NULL 它就会自动递增了SQL INSERT INTO TEST (ID, NAME) VALUES (NULL, name4);SQL INSERT INTO TEST (ID, NAME) VALUES (NULL, name5);SQL INSERT INTO TEST (ID, NAME) VALUES (NULL, name6);SQL SELECT * FROM TEST;ID NAME--- ------100name1101name2102name3103name4104name5105name64. 一些值得注意的地方4.1 插入指定 ID如果某条插入语句指定了 ID 的值如SQL INSERT INTO TEST (ID, NAME) VALUES (1000, name1001);SQL SELECT * FROM TEST;ID NAME--- ------100name1101name2102name3103name4104name51000name1001那么下次 ID 还是会在原来的基础上继续增加SQL INSERT INTO TEST (ID, NAME) VALUES (NULL, name1001);SQL SELECT * FROM TEST;ID NAME--- ------100name1101name2102name3103name4104name51000name1001但当序列的值到了 1000 的时候如果 ID 允许重复就会有两行记录 ID 都为 1000。但如果 ID 设置为了主键如本文的例子 ID NUMBER(11) PRIMARY KEY则插入就会报错Error : ORA-00001: unique constraint (SOFTWARE.SYS_C0014995) violated4.2 字段加引号在 SQL 语句中字段最好都加上引号不然可能会报错Error : ORA-00900: invalid SQL statement或ORA-24344: Success with Compilation Error4.3 SQUENCE第一次 NEXTVAL 返回的是初始值随后的 NEXTVAL 会自动增加 INCREMENT BY 对应的值然后返回增加后的值。CURRVAL 总是返回当前 SEQUENCE 的值但是在第一次 NEXTVAL 初始化之后才能使用 CURRVAL 否则会出错。一次 NEXTVAL 会增加一次 SEQUENCE 的值所以如果在同一个语句里面使用多个NEXTVAL其值就是不一样的。如果指定 CACHE 值Oracle 就可以预先在内存里面放置一些 SEQUENCE这样存取的快些。 CACHE 里面的取完后Oracle 自动再取一组到 CACHE。但使用 CACHE 或许会跳号比如数据库突然不正常关闭(shutdown abort) CACHE 中的 SEQUENCE 就会丢失。所以可以在 CREATE SEQUENCE 的时候用 NOCACHE 防止这种情况。4.4 性能在数据库操作中触发器的使用耗费系统资源相对较大。如果对于表容量相对较小的表格我们可以忽略触发器带来的性能影响。考虑到大表操作的性能问题需要尽可能的减少触发器的使用。对于以上操作就可以抛弃触发器的使用直接手动调用序列函数即可但这样可能在程序维护上稍微带来一些不便。三、在 Oracle 12c 中设置自增字段在 Oracle 12c 中设置自增字段就简单多了因为 ORacle 12c 提供了 IDENTITY 属性CREATE TABLE TEST (ID NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITY,NAME VARCHAR2(50BYTE) NOT NULL);这样就搞定了和 MySQL 一样简单???四、总结所以如上所属在 Oracle 中设置自增字段需要根据不同的版本使用不同的方法在 Oracle 11g 中需要先创建序列(SQUENCE)再创建一个触发器(TRIGGER)。在 Oracle 12c 中只需要使用 IDENTITY 属性就可以了。