十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
可以使用序列实现id自增,主键的语法为primary key。
遵化网站建设公司创新互联,遵化网站设计制作,有大型网站制作公司丰富经验。已为遵化上千多家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的遵化做网站的公司定做!
当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。
创建序列语法如下: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)操作等。
如果要实现这种的话,用自增主键好像就是实现不了吧。要是这样的话,那不用主键自己插入。每一次都取最大条数+1呗。
两个方法:
1,重新创建一个表,然后创建一个序列,把老数据导入新表,删除老表,修改新表名字为老表
2,直接在原来表上增加一个字段,创建一个序列,通过更新的方式修改老数据的这个字段。
具体操作主要是2点,首先是创建一个序列名sequence;
然后是,insert语句的时候:将自增的字段的位置,写成序列名.nextval。
从创建表开始,然后创建sequence,到insert语句
1.首先创建表
CREATE TABLE "FLOWCAL"."T_USERINFO"
( "C_ID" NUMBER(*,0),
"C_USER" VARCHAR2(20 BYTE),
"C_PASSWORD" VARCHAR2(20 BYTE),
"C_ROLE" VARCHAR2(20 BYTE),
"C_COMMENT1" VARCHAR2(20 BYTE),
"C_COMMENT2" VARCHAR2(20 BYTE)
)
现在想让C_ID自增一。
2.首先创建一个oracle的sequence,sql语句如下:
create sequence 序列名
increment by 1
start with 1
maxvalue 999999999
cycle;
建立一个最小为1,最大为999999999的一个序列号会自动循环的序列
下面的sequence,如下:
CREATE SEQUENCE "FLOWCAL"."SEQ_USERINFO"
MINVALUE 0
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 24
CACHE 20
ORDER
CYCLE ;
3.通过序列名.nextval实现插入时,字段的自增一
当向表中插入数据时,SQL语句写法如下:
SQL insert into 表名 values(,列1值,列2值,....);
"序列名"可以替换为自己需要的名字.
下面insert语句:
insert into T_USERINFO values(SEQ_USERINFO.NEXTVAL,'111','11','11','11','11')
解释如下\r\nt.* -----表示查询表t 所有字段\r\nt.rowid---表示唯一标识t表中的物理位置字段(伪列),这个字段是每个表中都默认有的,当设计表时没有设置主键或唯一标实的时候,也可吧他动作表的唯一标示(删除重复数据可用到)\r\nPU.YK---表示查询的是用户名为PU下的YK表,如果是以PU用户登陆的数据库,PU也可以省略\r\nt---PU.YK 表的别名,用于书写的时候方便简单,与PU.YK 完全相同,只是名字不同而已,就行你的学名和你的小名一样。 \r\n整个语句的意思也很简单,就是查询PU用户下YK表的所有记录信息,以及每条记录对应的ROWID信息 \r\n \r\nrowid是oracle特有的,sqlserver不支持,sqlserver可设置自增字段或唯一标识列代替
这样的需求感觉只能通过应用程序来实现。但是逐个检查ID,然后找到间隔的,这个开销比较大,不知道要达到什么目的。
我这有两个解决方案:
1、如果ID是为了显示序号,可以在查询的时候使用ROWNUM来实现
2、增加一个FLAG删除标志,删除的时候对FLAG打标记,这样ID就始终是连续的
使用序列+触发器创建自增列:
创建序列
-- Create sequence
create sequence SEQ_T_RECV
minvalue 1
maxvalue 9999999
start with 1
increment by 1
cache 50;
创建表
-- Create table
create table RECV_MSG
(
id NUMBER,
messageid VARCHAR2(32),
contents VARCHAR2(2000),
app_flg VARCHAR2(100),
phonenumber VARCHAR2(2000),
updatetime DATE default sysdate
);
创建触发器
CREATE OR REPLACE TRIGGER "recv_trig"
BEFORE INSERT ON recv_msg
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
BEGIN
SELECT SEQ_T_RECV.NEXTVAL INTO :NEW.ID FROM DUAL;
END recv_trig;
删除数据
DELETE FROM RECV_MSG WHERE ID=1;