oracle的主键要设置默认值为自动递增,怎么处理?
2个回答
展开全部
Oracle
不直接支持 自动递增的列。
需要创建一个序列 SEQUENCE。
又由于无法在列的默认值那里,设置默认值为序列。因此只能通过触发器来设置。
设置好触发器以后,所有的插入语句,将忽略外部传入的 id 数据,只使用指定的序列号来产生。
SQL> CREATE SEQUENCE test_sequence2
2 increment by 1 -- 每次递增1
3 start with 1 -- 从1开始
4 nomaxvalue -- 没有最大值
5 minvalue 1 -- 最小值=1
6 NOCYCLE; -- 不循环
Sequence created.
SQL> CREATE TABLE test_create_tab2 (
2 id INT DEFAULT test_sequence2.NEXTVAL,
3 val VARCHAR(10),
4 PRIMARY KEY (id)
5 );
id INT DEFAULT test_sequence2.NEXTVAL,
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL> CREATE TABLE test_create_tab2 (
2 id INT,
3 val VARCHAR(10),
4 PRIMARY KEY (id)
5 );
Table created.
SQL> CREATE OR REPLACE TRIGGER BeforeTestCreate2Insert
2 BEFORE INSERT ON test_create_tab2
3 FOR EACH ROW
4 BEGIN
5 SELECT test_sequence2.nextval INTO :new.id FROM dual;
6 END;
7 /
Trigger created.
SQL> INSERT INTO test_create_tab2(val) VALUES ('NO id');
1 row created.
SQL> INSERT INTO test_create_tab2(id, val) VALUES (1, 'id no use');
1 row created.
SQL> SELECT * FROM test_create_tab2;
ID VAL
---------- --------------------
1 NO id
2 id no use
不直接支持 自动递增的列。
需要创建一个序列 SEQUENCE。
又由于无法在列的默认值那里,设置默认值为序列。因此只能通过触发器来设置。
设置好触发器以后,所有的插入语句,将忽略外部传入的 id 数据,只使用指定的序列号来产生。
SQL> CREATE SEQUENCE test_sequence2
2 increment by 1 -- 每次递增1
3 start with 1 -- 从1开始
4 nomaxvalue -- 没有最大值
5 minvalue 1 -- 最小值=1
6 NOCYCLE; -- 不循环
Sequence created.
SQL> CREATE TABLE test_create_tab2 (
2 id INT DEFAULT test_sequence2.NEXTVAL,
3 val VARCHAR(10),
4 PRIMARY KEY (id)
5 );
id INT DEFAULT test_sequence2.NEXTVAL,
*
ERROR at line 2:
ORA-00984: column not allowed here
SQL> CREATE TABLE test_create_tab2 (
2 id INT,
3 val VARCHAR(10),
4 PRIMARY KEY (id)
5 );
Table created.
SQL> CREATE OR REPLACE TRIGGER BeforeTestCreate2Insert
2 BEFORE INSERT ON test_create_tab2
3 FOR EACH ROW
4 BEGIN
5 SELECT test_sequence2.nextval INTO :new.id FROM dual;
6 END;
7 /
Trigger created.
SQL> INSERT INTO test_create_tab2(val) VALUES ('NO id');
1 row created.
SQL> INSERT INTO test_create_tab2(id, val) VALUES (1, 'id no use');
1 row created.
SQL> SELECT * FROM test_create_tab2;
ID VAL
---------- --------------------
1 NO id
2 id no use
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要设置一个sequence 也就是一个序列.
先创建序列:
创建序列> create sequence seq_(序列名称)
2 start with 1 序列从1开始
3 increment by 1 每次自增1
4 maxvalue 99999999 序列值最大值
5 order 排序
6 nocycle 不循环
7 nocache; 不适用缓存
create sequence seq_序列名(这3个字替换成你想要的)
start with 1
increment by 1
maxvalue 99999999
order
nocycle
nocache;
然后你在插入数据的使用讲要用到这个序列.
比如说, 你创建了一个名为: seq_student 这样的一个虚列
插入语句: insert into student(id,name,age) values(seq_student.nextval,'小兔子',25)
这里id就用的这个序列来填充
name用的是varchar2的数据类型 所以为'小兔子'
age用的是number的数据类型 所以为25
这样就可以啦!
先创建序列:
创建序列> create sequence seq_(序列名称)
2 start with 1 序列从1开始
3 increment by 1 每次自增1
4 maxvalue 99999999 序列值最大值
5 order 排序
6 nocycle 不循环
7 nocache; 不适用缓存
create sequence seq_序列名(这3个字替换成你想要的)
start with 1
increment by 1
maxvalue 99999999
order
nocycle
nocache;
然后你在插入数据的使用讲要用到这个序列.
比如说, 你创建了一个名为: seq_student 这样的一个虚列
插入语句: insert into student(id,name,age) values(seq_student.nextval,'小兔子',25)
这里id就用的这个序列来填充
name用的是varchar2的数据类型 所以为'小兔子'
age用的是number的数据类型 所以为25
这样就可以啦!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询