oracle中有张表table1,主键是column1,非自增的,这张表中已经有数据了。
现在我想加一个自增的字段表示主键,将原来的column1字段仍然保持只是不做主键了,这个该怎么做?请各位帮帮我!
我考虑了一种方案是,另外建一张表table2,字段跟table1一样,只不过多个自增字段,然后将table1中的数据插入到table2中,再删掉table1,再将table2改下名字变成table1。这样应该可以,就是觉得比较麻烦。
各位有没有直接在table1做修改的办法?
直接在table1上改,增加一列,修改主键,但是这个主键序列的值怎么生成?
谢谢各位!小弟不胜感激!应该很简单的问题吧,让各位见笑了,因为任务比较急,在线等各位的回复,谢谢!
现在我想加一个自增的字段表示主键,将原来的column1字段仍然保持只是不做主键了,这个该怎么做?请各位帮帮我!
我考虑了一种方案是,另外建一张表table2,字段跟table1一样,只不过多个自增字段,然后将table1中的数据插入到table2中,再删掉table1,再将table2改下名字变成table1。这样应该可以,就是觉得比较麻烦。
各位有没有直接在table1做修改的办法?
直接在table1上改,增加一列,修改主键,但是这个主键序列的值怎么生成?
谢谢各位!小弟不胜感激!应该很简单的问题吧,让各位见笑了,因为任务比较急,在线等各位的回复,谢谢!
可以对表进行DDL操作?会影响原有的应用?
如果不会建议这么做,主键自增的参考我的BLOG(2种方法)
http://blog.csdn.net/java3344520/archive/2009/11/30/4907591.aspx
commit;
Alter table tabname drop primary key(old_col) ;
commit;
Alter table tabname add primary key(col) ;
commit;
-- 然后用row_number() over(order by old_key_column) 去更新新建的字段。-- 然后根据 row_number()生成的ID号,查出最大的ID号,去新创建一个序列,
-- 此序列为 查出最大的ID号+1 作为起始点(start with ..)-- 然后创建触发器,每次插入数据时 自动取此序列的下一个值,给新加的自增字段!
-- Oracle 自增字段 示例:CREATE TABLE test(
id number(18,0),
name varchar2(20));CREATE sequence test_seq start with 1 increment by 1 nomaxvalue nocycle;CREATE OR REPLACE TRIGGER test_trig_autoinc
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
IF (:new.ID IS NULL) THEN
SELECT test_seq.nextval INTO :new.ID FROM DUAL;
END IF;
END;
/insert into test(name) values('luoyoumou1');
insert into test(name) values('luoyoumou2');commit;SQL> select * from test; ID NAME
---------- ---------------------------------------
1 luoyoumou1
2 luoyoumou2已用时间: 00: 00: 00.32-- 看到了吧:id 字段的值自动插入了,不用你管!
然后就可以了
A B
--- ----
14 0
12 4
8 2
2 2
44 9
23 8
6 rows selected
SQL> update test set a=seq_code_name.nextval;
6 rows updated
SQL> select * from test;
A B
--- ----
41 0
42 4
43 2
44 2
45 9
46 8
6 rows selected
SQL>