3.1 创建主键
要想为表的某个列建立主键,可以用Alter table 或 CREATE TABLE 命令完成。
1在建表结构中创建主键
CREATE TABLE [schema.]table_name …
[SCOPE IS [user.]scope_table_name][column_constraint]…
. . . . . .
例1:
CREATE TABLE dept
(deptno number(2),
dname varchar2(20),
loc varchar2(20),
CONSTRAINT pk_dept PRIMARY KEY (deptno)
);
2用alter table创建主键
ALTER TABLE [schema.]tablename
ADD ( constraint_name PRIMARY KEY (column1 [,column2,...])
例2:
ALTER TABLE PARK_REVENUE
ADD(park_rev_pk PRIMARY KEY ( ACCOUNT_NO));
例3:
create table dept
(deptno number(5) primary key,
dname varchar2(20),
loc varchar2(30))
disable primary key;
注:当主键被说明为 disable primary key 时,不能建立相应的外部键。一定先用:
alter table dept enable primary key后方可使用:
deptno constraint fk_deptno References dept(deptno)
3唯一索引和主键区别
唯一索引:唯一索引使用CREATE UNIQUE INDEX命令完成,能标识数据库表中一行的关键字。在数据字典中建立了唯一索引名字。
主 键:主键使用primary key来指定,能标识数据库表中一行的关键字。在数据字典中也建立了唯一索引名字。
差 别:被定义为唯一索引的列可以空,而被定义为主键的列不能空。
4建立索引、主键的方法:
在建表命令中用Constraint说明详见《oracle8i sever SQL Reference》或者 Help constraint得到语法说明。
Create table dept
(deptno number(2),
dname varchar2(40) constraint unq_dname unique,
loc varchar2(50)
);
constraint unq_dname unique可以允许dname没有值,这样未指定空间分配参数的语句,oracle 采用缺省参数为 unq_dname 分配空间.
同样可以用下面命令达到如上的效果:
Create table dept
(deptno number(2),
dname varchar2(20),
loc varchar2(20),
constraint unq_dname unique(dnam)
using index pctfree 20
tablespace users_x
STORAGE(initial 8K next 6k)
);
constraint unq_dname unique可以允许dname没有值,并指定空间分配参数的语句,oracle将根据参数为 unq_dname 分配空间.
Create table dept
(dept number(2) constraint pk_dept primary key,
dname varchar2(20),
loc varchar2(20)
);
同样可以用下面命令完成上面的说明:
Create table dept
(deptno number(2),
dname varchar2(20),
loc varchar2(20),
constraint pk_dept primary key (deptno)
);
建立完表结构后再建索引、主键:
优点:索引可以放在另一表空间中,如果在表中直接写,则必须用using index 说明分配大小、表空间等。
Alter table ship_cont
Add primary key(ship_no,container_no) Disable
一般声明主键时,可以让其有效(缺省),也可以使其无效(Disable)
建议:在程序开发调试中,经常先将主键设为Disable,上面的ship_no,container_no一起组成主键,这种两个以上的字段组成的叫组合键(最多16个字段),不要指定过多的组合键以避免出现性能下降.
3.2 改变主键
命令语法详见alter table命令
限制:不许修改作为主键的列;
不许修改作为主键的名字
可以:可以定义一主键;或使主键无效
ALTER TABLE [schema.]tablename
DISABLE constraint_name
例1:
Alter table dept
Disable scott.pk_dept;
这样,如果有一外部键依赖于该主键,则系统给出下列错误:
ORA-02297: Cannot disable constraint ( scott.pk_dept)-
Depentencies exist.
在这种情况下,必须先删掉依赖于该主键的外部键并使该外部键无效,然后查才能使主键无效。
3.3 删除主键
ALTER TABLE [schema.]tablename
DROP CONSTRAINT constraint_name [CASCADE]
删除顺序:
1)使该外部键无效,删掉依赖于该主键的外部键;
2)使该主键无效,删掉该主键
或:
当在删掉主键命令后加参数 CASCADE , 则在删掉主键的同时把依赖于该主键的外部键一起删掉。
DROP INDEX index_name ;
4外部键
建立外部键是保证完整性约束的一种唯一方法,也是关系数据库的精髓所在。许多曾使用过桌面数据库(如Dbase, Foxpro)的软件人员不太习惯或不使用关系数据库的主键与外部键的方法来设计自己的数据库结构,这是很不好的方法。应该在使用关系数据库中将习惯改过来。否则设计的应用结构和效率就不可能达到用户的要求。
4.1 建立外部键
外部键的建立与主键的建立类似,都可以在 CREATE TABLE命令或ALTER TABLE命令中来说明,详细语法见《Oracle SQL reference》Create table命令9和Alter table命令。
1.在 CREATE TABLE命令语句中建立外部键
2.用 ALTER TABLE命令语句建立外部键
ALTER TABLE [schema.]table_name
ADD ( CONSTRAINT_NAME FOREIGN KEY (Column1 [,column2,. . .])
REFERENCES [schema.]table_name (Column1 [,column2,. . .]);
CREATE TABLE dept
(deptno NUMBER(2),
dname VARCHAR2(9),
loc VARCHAR2(10),
CONSTRAINT pk_dept PRIMARY KEY (deptno) );
Create table emp
( empno number(4),
ename varchar2(10),
job varchar2(10),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno constraint fk_deptno References dept(deptno)
);
同样下面语句的效果与上面一样:
Create table emp
( empno number(4),
ename varchar2(10),
job varchar2(10),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno,
constraint fk_deptno
Foreign key(deptno) References dept(deptno)
);
使用Delete cascade管理引用完整性
Create table emp
( empno number(4),
ename varchar2(10),
job varchar2(10),
mgr number(4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2) constraint fk_deptno
References dept(deptno)
On Delete CASCADE
);
常用组合键的完整性约束:
Alter table phone_calls
ADD constraint fk_areaco_phoneno
Foreign key(areaco,phoneno)
References austomers(areano,phoneno)
Exceptions into wrong_numbers
Create table TROUBLE
( City varchar2(10),
Sampledate date,
Noon number(4,1),
Midnight number(4,1),
Precipitation number,
Constraint TROUBLE.PK PRIMARY KEY(city,Sampledate)
);
4.2 修改外部键
由于ORACLE不允许改变已被定义的外部键的列,也不允许改变外部键的名字,所以你只能用ALTER TABLE定义一个新的外部键或者使一个已存在的外部键无效:
ALTER TABLE [schema.]table_name
DISABLE CONSTRAINT_NAME;
4.3 删除外部键
要删除已定义的外部键,要用 Alter table 命令中的 DROP 关键字来实现,命令语法见Alter table 命令。
ALTER TABLE [schema.]table_name
DROP CONSTRAINT constraint_name;
提示:关系数据库的核心主要体现在主键和外部键上。在进行数据库结构设计时,建议要采用主键和外部键来定义那些有关系的表。这样可以保证应用系统数据的完整性和一致性。