有一个表,结构如下:
CREATE TABLE PLANTOCONTRACT
(
  "合同号"        NVARCHAR2(28)                 NOT NULL,
  "序号"          NUMBER(15)                    NOT NULL,
  "备件名称"      VARCHAR2(180 BYTE),
  "型号规格图号"  VARCHAR2(400 BYTE),
  "单价"          NUMBER(11,3),
  "数量"          NUMBER(7),
  "单位"          CHAR(4 BYTE),
  "生产厂商"      VARCHAR2(80 BYTE),
  "交货周期"      NUMBER(6,1),
  "总价"          NUMBER(12,2),
  "自动编号"      NUMBER(15),
  "备注"          VARCHAR2(250 BYTE),
  ID              NUMBER
)
其中ID是的号码是自动增加的,我想做一个TRIGGER,当在插入结束后(插入的字段ID为-1),然后自动更新当前的表,并按照ID记录的顺序(MAX(ID))进行更新.我自己写了个TRIGGER为什么不对呢?
CREATE   OR   REPLACE   TRIGGER   beijian.tran_data   
  AFTER  insert   ON   beijian.plantocontract  
  FOR   EACH   ROW     
  declare     
  rol_num   NUMBER;   
  begin   
  select   max(id)   into   rol_num   from   beijian.plantocontract;   
  rol_num:=rolnum+1;   
  update  beijian.plantocontract set id=rol_num ;   
  commit;   
  end   tran_data; 请大侠帮忙看看,小弟初学,谢谢!
另外该表中有1万多条数据,因为是改造表结构,ID字段是后增加的(全是空的)故我想把已有的记录给编上记录号(1,2,3....),如何通过脚本进行操作呢?

解决方案 »

  1.   

    update  beijian.plantocontract set id=rol_num
    这句没有where 会把表里所有纪录的ID更新成一样的
      

  2.   

    1.建一个序列create sequence id_seq;
    2.插入的时候直接给id赋值:id_seq.nextval
    这样就不会重复了,也不要触发器了,就是有可能id不连续,但是保证唯一
      

  3.   

    连续不连续应该没有什么意义的,真的需要连续的话,用rownum就可以了
      

  4.   

    而且“并按照ID记录的顺序(MAX(ID))进行更新”.按照这种方法,也不可能达到id连续的目的,比如1、2、3。100,中间如果删除掉某条记录后就断了
      

  5.   

    1.建一个序列create sequence id_seq; 
    2.插入的时候直接给id赋值:id_seq.nextval 
    这样就不会重复了,也不要触发器了,就是有可能id不连续,但是保证唯一我也是这么想的
    只不过要先把前面1万多条纪录先写上ID ,写个存储过程用游标做一下,很快的