几种类型的主键强制性,比如DEFERRABLE和NOVALIDATE,将影响使用主键约束的索引类型.这些选项将使用nonunique索引,一个常规主键约束,从来不试图违反它,甚至临时的在一个事务内,使用一个唯一索引。
事实上,一个主键的表存储在数据字典内,我们看一下数据字典视图USER_TAB_COLUMNS,它是一个查看一个表内字段名的字典视图。我们也有约束的视图,是USER_CONSTRAINTS和USER_CONS_COLUMNS,这些视图展示哪些表有约束,约束名、类型和状态
创建主键约束
这部分中将会使用一个示例表:TEMP,表结构如下:
Name Null? Type
ID VARCHAR2(5)
NO NUMBER
创建主键有几种方式:
1、 列约束子句
2、 表约束子句
3、 ALTER TABLE语句
下面讨论创建主键约束的三种格式技巧和关系。其他类型的约束,Unique,Foreign key, check,也可以使用每种方式创建
列约束子句
下面创建一张表,有两个字段,字段id为主键,这是一个列约束子句的例子。
CREATE TABLE temp(
id VARCHAR2(5) PRIMARY KEY,
no NUMBER
);
也可以为主键约束指定名称,
CREATE TABLE temp(
id VARCHAR2(5) CONSTRAINT PRIMARY KEY my_constraint_name,
no NUMBER
);
表约束子句
表约束子句是在表定义结尾定义主键约束。表约束子句是CREATE TABLE语句的一部分,如果约束子句有语法错误,整个语句将失败,表不会被创建。
下面以模板方式举例说明,Create table语句声明了一个主键,表约束子句允许包括多个约束,使用“,”分隔每一个约束定义。
CREATE TABLE temp
(id VARCHAR2(5),
no NUMBER,
CONSTRAINT PRIMARY KEY (id),
CONSTRAINT. . next constraint,
CONSTRAINT. . next constraint) TABLESPACE etc;
下面创建一个TEMP表,使用表约束子句。
CREATE TABLE temp
(id VARCHAR2(5),
no NUMBER,
CONSTRAINT PRIMARY KEY (id)) TABLESPACE student_data;
ALTER TABLE 语句
alter table语句是另外一个管理约束的选择。一旦你创建了一张表,你可以使用alter table语句管理约束、增加列、改变存储参数。
执行功能 ALTER 语法
Add a constraint ALTER TABLE table_name ADD CONSTRAINT etc
Drop a constraint ALTER TABLE table_name DROP CONSTRAINT etc
Disable a constraint ALTER TABLE table_name DISABLE CONSTRAINT etc
Enable a constraint ALTER TABLE table_name ENABLE CONSTRAINT etc
下面DDL包含两个DDL语句:Create table语句和Alter table语句。主键名为:PK_TEMP
CREATE TABLE temp (
id VARCHAR2(5),
no NUMBER
);
ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY (id);
Alter table 命令有许多选项,一个记住语法的方法是Oracle执行这个操作需要的信息:
1)、你不得不告诉Oracle你准备alter什么表:
Alter table table_name
2)、然后,你准备做什么?Adding 一个约束
ALTER TABLE table_name ADD CONSTRAINT
3)、强烈建议但不要求为约束定义个名字。约束名不需要放在引号里,但会以大写字母形式存储在数据字典里,
ALTER TABLE temp ADD CONSTRAINT pk_temp
4)、表示约束类型将是Primary Key,Unique,Foreign Key,或Check约束
ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY
5)、跟在约束类型后面有几种特殊选项,Primary Key和Unique约束,需要指定约束的列;Check约束需要指定约束规则。
ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY (ID);
6)、Primary Key和Unique约束应当指定索引的表空间名,使用USING INDEX TABLESPACE子句.
ALTER TABLE temp ADD CONSTRAINT pk_temp PRIMARY KEY (ID) USING INDEX TABLESPACE student_index;
ALTER TABLE students
ADD CONSTRAINT pk_students PRIMARY KEY (student_id)
USING INDEX TABLESPACE student_index;
如果不指定表空间,Oracle使用默认表空间里创建索引。所有的oracle用户都可以在默认表空间中创建索引。没有指定表空间的表和索引都会创建在默认表空间中。
设置权限配额:
REVOKE UNLIMITED TABLESPACE FROM SCOTT;
ALTER USER SCOTT QUOTA UNLIMITED ON STUDENT_DATA;
ALTER USER SCOTT QUOTA UNLIMITED ON STUDENT_INDEX;
ALTER USER SCOTT DEFAULT TABLESPACE STUDENT_DATA;
查询表空间限额
SELECT tablespace_name, max_bytes FROM user_ts_quotas;
当前的序列值
创建序列:
CREATE SEQUENCE sample_sequence
MINVALUE 0
START WITH 0
MAXVALUE 20
NCREMENT BY 5
NOCACHE
CYCLE;
MINVALUE :序列最小值
START WITH :序列起始值
MAXVALUE :序列最大值
NCREMENT BY : 序列步进值,currval 和nextval的差值
NOCACHE / CACHE : 是否使用序列缓存,CACHE 5表示缓存中存储5个序列值,当这些序列值用尽时,再生成5个新的序列值存在缓存中。NOCACHE表示不使用缓存.
CYCLE / NOCYCLE :指定达到最大值后是否从新开始循环NOCYCLE 否,CYCLE是
序列命名一般:
table_name_PK_SEQ
默认CREATE SEQUENCE语句将最大可生成 1027 数值.
Enable, Disable, and Drop
删除主键,同时删除主键索引:
ALTER TABLE <table_name> DROP CONSTRAINT
<constraint_name>;
如果有其他表把主键作为外键引用,Oracle不允许删除。
ALTER TABLE state_lookup DROP CONSTRAINT state_lookup CASCADE;
将删除主键及所有以主键为外键的约束.
ALTER TABLE state_lookup
DISABLE CONSTRAINT state_lookup CASCADE;
使主键及把主键作为外键的约束都不可用.
当主键被disabled时,主键索引从数据字典中被删除,然而一旦主键被enabled,主键索引立刻就重新创建
ALTER TABLE state_lookup ENABLE CONSTRAINT pk_state_lookup;
这个Alert table语句重建索引,设置主键为enabled,外键仍然不可用,每一个外键都要用下面语句enbled.
ALTER TABLE students ENABLE CONSTRAINT fk_students_state;
ALTER INDEX pk_state_lookup REBUILD;
Deferrable Option
ALTER TABLE parent ADD CONSTRAINT pk_parent PRIMARY KEY
(parent_id) DEFERRABLE;
ALTER TABLE parent DISABLE CONSTRAINT pk_parent;
BEGIN
INSERT INTO parent values (1,'A');
INSERT INTO parent values (1,'B');
INSERT INTO parent values (3,'C');
INSERT INTO parent values (4,'D');
END;
ALTER TABLE parent ENABLE NOVALIDATE CONSTRAINT pk_parent;
异常处理
主键冲突oracle中定义的异常名称:DUP_VAL_ON_INDEX
CREATE OR REPLACE FUNCTION insert_parent
(v_id NUMBER, v_desc VARCHAR2) RETURN BOOLEAN
IS
BEGIN
INSERT INTO parent VALUES (v_id, v_desc);
return TRUE;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN return FALSE;
END;