建立一个序列,和一个触发器,insert数据的时候自动将序列插入

解决方案 »

  1.   

    create sequence seq_name
    increment by 1
    start with 1
    maxvalue 99999999
    nocycle
    cache 10--调用:
    insert into table(id,name) values(seq_name.nextval,'militant(小猪油) ');
      

  2.   

    两种方法
    方法一:
      用触发器建一个序列
    create sequence a_seq increment by 1 start with 100;
    建一个触发器, 自动+1
    create or replace trigger t_a
    before insert on a
    for each row
    begin
         select s_a.nextval into :new.b from dual;
    end;方法二:
      建一个序列
         create sequence a_seq increment by 1 start with 100;
       在语句中+1
      insert into tbl(id,....)
         values (a_seq.nextval,....)
      

  3.   

    上面是不是只实现了一个序列呢?那触发器呢?seq_name.nextval是什么东西?
      

  4.   

    N个表当然要N个处理啦,问题是你N个表有必要全用这种主键吗,这种主键是最没有实际意义的,可见你对数据库的表设计方面还需要深入
      

  5.   

    -- Create sequence 
    create sequence FK_ID              //创建序列,以后可以自动生成
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 100
    increment by 1
    cache 20;--create table                    //关联的表空间
    create table TZXINDEX
    (
      ID        NUMBER not null,
      TITLE     VARCHAR2(30),
      CONTENT   VARCHAR2(500),
      LINKPAGE  VARCHAR2(500),
      FINDTIMES NUMBER,
      SAVEDATE  DATE
    )
    //定义主键
    alter table TZXINDEX
      add constraint FK_ID primary key (ID)
      using index 
      tablespace DATA555
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 2M
        next 2M
        minextents 1
        maxextents 505
        pctincrease 0
      );//当要插入一条新记录时,则ID会自动加1
    sql语句如下:
    insert into tzxindex values(FK_ID.nextval,'标题','内容','......); FK_ID.nextval就是表示ID自动加1后的值
      

  6.   

    楼上的,为什么上面能自动执行呢?
    上面说的只是把sequence的名字和TZXINDEX的外主键名字取成一样啊?这样就能实现所需功能?
      

  7.   

    1.oracle里本身就有rowid列,可以直接作为无实际意义的主键。
    select rowid,id,name.....from your_table;
    2.使用freddy2003() 提供的方法,建议楼主先看一下有关书籍。或搜一下以前的贴子。
      

  8.   

    楼上的你说rowid怎么实现啊,是不是建个字段,然后把这个字段的类型设置为rowid啊?但是字段没有这种类型啊!
      

  9.   

    哇靠,rowid里头是什么东西,一大串的字符,不是我需要的自己定义长度的数字啊
      

  10.   

    rowid就象是oracle隐藏的一列数据,用户可以直接使用.
    另外,我同意楼主的使用无实际意义的值作为主键.其实,我认为,正常情况下,任何表都有一个唯一主键,最好就是数据库系统自己生成,不能让任何用户修改.因为只有这样,才能真正保证数据的一致性.见过了太多不能保证数据一致性的数据库设计.最关键的是我觉得很多程序员根本就不知道这一点.比如,很多程序员建一个学生信息数据库,包括姓名,性别,学号等字段,然后再建一个考试成绩表,包括姓名,成绩2个字段.如果不用没有实际意义的昨晚主键,那么就有可能出现数据不一致的问题.比如,昨天添加的数据,姓名为张三,南,200402030,考试成绩为张三,90.今天发现张三的名字输入错误,应该为张伞,于是用户用程序的修改功能修改学生姓名为张伞.然而,学生成绩表的张三名字并没有改过来,数据不一致了.解决的办法就是使用没有意义的昨晚主键,比如学生信息表,添加ID字段,其值有数据库系统自动生成,然后,在学生成绩里不使用姓名,而使用其ID来存放对应的学生信息.所以无论如何改学生的姓名,对应的ID不会变化,数据就可以保证一致了.
      

  11.   

    建议楼主先找本oracle基础的书看一遍.入门先.
      

  12.   

    REM 績效考核系統紀錄表
    REM ID //ID號自動加1(primary key)
    REM YEAR //年度
    REM MONTH //月份
    REM EMP_ID //被考評人工號
    REM KPZX_ID //考評主項ID
    REM KPXX_ID //考評細項ID
    REM SCORE //分值(可正可負)
    REM WH_DATE //維護日期
    REM WHR_EMP_ID //維護人ID(存工號)
    REM KPSM //考評說明
    DROP TABLE JXKH_RECORD;
    CREATE TABLE JXKH_RECORD(
         ID NUMBER(15) ,
         YEAR NUMBER(4) NOT NULL,
         MONTH NUMBER(2) NOT NULL,
         EMP_ID VARCHAR2(16 BYTE) NOT NULL,
         KPZX_ID NUMBER(2) NOT NULL,
         KPXX_ID NUMBER(2) NOT NULL,
         SCORE NUMBER(4,2) NOT NULL,
         WH_DATE DATE DEFAULT SYSDATE NOT NULL,
         WHR_EMP_ID VARCHAR2(16 BYTE) NOT NULL,
         KPSM VARCHAR2(300 BYTE) NOT NULL,
         PRIMARY KEY(ID)
        ) 
        TABLESPACE "LOGISTIC" PCTFREE 10 PCTUSED 0 INITRANS 1 
        MAXTRANS 255 
        STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 
        2147483645 PCTINCREASE 0) 
        LOGGING ;REM 創建一個自動增1的序列DROP SEQUENCE ID_SEQ;
    CREATE SEQUENCE ID_SEQ 
    NOCYCLE
    MAXVALUE 999999999999999
    START WITH 1
    ORDER 
    INCREMENT BY 1 ;
    REM 創建執行自動增加主鍵字段的一個触發器
    DROP TRIGGER ID_TRIGGER;
    CREATE OR REPLACE TRIGGER ID_TRIGGER
    BEFORE INSERT ON JXKH_RECORD 
    FOR EACH ROW 
    DECLARE 
    NEXT_ID NUMBER;
    BEGIN
    --GET THE NEXT ID FROM THE SEQUENCE
    SELECT ID_SEQ.NEXTVAL 
    INTO NEXT_ID
    FROM DUAL; --USE THE SEQUENCE NUMBER AS PRIMARY KEY
    --FOR THE RECORE BEING INSERTED
    :NEW.ID:=NEXT_ID;
    END ;
    /REM 創建一個防止ID字段被更新的触發器
    DROP TRIGGER ID_UPD;
    CREATE  OR  REPLACE TRIGGER ID_UPD
    BEFORE UPDATE OF ID ON JXKH_RECORD
    FOR EACH ROW
    BEGIN 
    RAISE_APPLICATION_ERROR(-2000,'update column ID on table jxkh_record are not allowed.');
    END;
    /