主键(primary key)约束、外键(foreign key)约束、唯一(unique)约束、检查(check)约束、默认值(default)约束实例
Oracle 有如下类型的约束: NOT NULL(非空)、UNIQUE Key(唯一约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)、CHECK约束 Oracle使用SYS_Cn格式命名约束. 创建约束:在建表的同时创建、建表后创建 约束的类型有如下几种: C (check constraint on a table)? P (primary key)? U (unique key)? R (Referential AKA Foreign Key)? V (with check option,on a view)? O (with read only,on a view) 1、创建约束 CREATE TABLE students( student_id VARCHAR2(10) NOT NULL, student_name VARCHAR2(30) NOT NULL, college_major VARCHAR2(15) NOT NULL, status VARCHAR2(20) NOT NULL, state VARCHAR2(2), license_no VARCHAR2(30) ) TABLESPACE student_data; 2、创建主键:? ALTER TABLE students ADD CONSTRAINT pk_students PRIMARY KEY (student_id)? USING INDEX TABLESPACE student_index; Alter table table_name add constrants BID primary key (bookno); ALERT TABLE table_name MODIFY( column1 PRIMARY KEY); 3、创建Unique约束: ALTER TABLE students ADD CONSTRAINT uk_students_license UNIQUE (state,license_no) USING INDEX TABLESPACE student_index; 4、创建Check约束:定义每一记录都要满足的条件,条件表达式不允许有:CURRVAL,NEXTVAL,LEVEL,ROWNUM,SYSDATE,UID,USER,USERENV 函数: ALTER TABLE students ADD CONSTRAINT ck_students_st_lic CHECK ((state IS NULL AND license_no IS NULL) OR (state IS NOT NULL AND license_no is NOT NULL)); 添加check约束(check_1为约束名,dept_salary为字段名 ) alter table emp add constraint check_1 check(dept_salary>0); ? 5、创建外键约束: ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup (state); 6. 创建不能为空约束 not null alter table table_name modify(name not null); alter table table_name modify name1 varchar2(20) not null;
实例1: 首先创建学生信息表studentinfo和学生成绩表testinfo。? --学生信息表? CREATE TABLE studentInfo (? stuNo CHAR(10) NOT NULL,? stuName VARCHAR2(20) NOT NULL,? stuSex NUMBER(1),? stuBirthday DATE DEFAULT SYSDATE,? stuAddress VARCHAR2(20)? );? --学生成绩表? CREATE TABLE testInfo (? stuNo CHAR(10) NOT NULL,? classNo CHAR(5) NOT NULL,? testScore NUMBER(3,1)? );? --约束条件:设置主键? alter table testinfo add constraint fk_1 foreign key (stuno) references studentinfo(stuno);? --约束条件:设置外键? alter table studentinfo add constraint pk_1 primary key (stuno);? --约束条件:设置唯一? alter table testinfo add constraint uniq_1 unique (stuno,classno);
主键、外键、唯一约束、check约束、非空约束等约束详解实例: 1、--创建表 create table tb_Dept ( Deptid char(2) Primary key, DeptName char(16) Not Null ) 2、--外键约束 create table tb_Student ( Studid char(10) Primary key, Studname char(8) Not null, Deptid char(2) Not null, Constraint FK_DeptID Foreign Key (Deptid) References Tb_Dept(DeptID) ) 3、--外键约束简化形式,必须要求tb_Dept表中DeptID为主键,且数值类型相同 create table Tb_Student ( StudId char(10) Primary key, StudName char(8) Not null, DeptID char(2) not null References Tb_Dept ) 4、--创建表,无主键 create table Tb_Class ( ClassID char(8) not null, ClassName varchar(30) not null, DeptId char(2) not null, ClassStuNumber int ) 5、--创建表,同时定义主键 create table Tb_Class ( classid char(8) not null, DeptID char(2) not null, ClassStuNumber int constraint PK_ClassID Primary key (ClassID,ClassName) ) 6、--新增主键 Alter table Tb_class ADD Constraint PK_ClassID primary key(Classid) 7、--删除主键 Alter table tb_Class Delete Constraint PK_ClassID Primary key(ClassID) 8、--外键级联更新,删除,简化形式 Create table tb_student ( studID char(10) Primary key, StudName char(10) not null, DeptID char(2) not null References tb_Dept? On Update cascade? on delete cascade ) 9、--外键级联更新,删除,标准 create table tb_student ( studid char(10) Primary key, StudName char(8) not null, Constraint FK_Deptid foreign key(DeptID) References Tb_Dept(DeptID)? on update Cascade? on delete cascade? ) 10、--创建无外键的表 create table tb_student ( studId char(10) Primary key, DeptID char(2) not Null ) 11、--给相应的列(DeptID)添加外键约束 Alter table tb_Student ADD Constraint FK_DeptID Foreign key(DeptID) References tb_Dept(DeptID) 12、--删除外键约束 Alter table tb_Student Drop Constraint fk_DeptID? 13、--创建表是创建Unique约束 Create table tb_Student ( studId char(10) Primary key, Studname char(8) not null Unique nonclustered, DeptID char(2) not null references Tb_Dept ) create table tb_student ( studID char(10) Primary key, Studname char(8) not null, deptid char(2) not null references tb_dept, constraint Uk_Stuname Unique(Stuname) ) 14、--创建表结束后,添加、删除Unique约束 --添加Unique约束 alter table tb_Student ADD Constraint Uk_Depname Unique(Deptname) 15、--删除unique约束 Alter table tb_student Drop Constraint uk_Depname 16、--创建默认值约束 Create table tb_student ( stuId char(10) Primary key, stuName char(8) not null, DeptID char(2) Not null references tb_Dept, sex char(2) not null default 'M‘, Birthday smalldatetime not null default getdate() ) 17、--添加默认值约束 alter table tb_student ADD constraint DEF_sex default 'M‘ for sex 18、--删除默认值约束 alter table tb_student Drop Constraint DEF_Sex 19、--创建表时,创建check约束 create table tb_student ( StudId char(10) Primary key, DeptId char(2) not null references tb_Dept, sex char(2) not null default 'M‘ check(sex in ('M‘,'F‘)), zipcode char(6) not null check (Zipcode like ‘[0-9][0-9][0-9][0-9][0-9][0-9]‘ ), constraint ck_StudID Check (StudId like 'S[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]‘) ) 20、--check约束的其他例子 check(coursescore >= 0 and coursescore < = 100) check(empld like ‘[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]‘ or empld like ‘[A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]‘) check(telno in (?‘,?‘,?‘) or telno like ?[0-9][0-9]‘) check(salary between 3000 and 10000) check(is_manager = 1 and sex = 'F‘) check(case when is_manager<> 1 and sex = 'F‘) Then 1 Else 0 End = 0? 21、--添加check约束 alter table tb_student with nocheck ADD Constraint ck_Sex check(sex in ('M‘,'F‘)) 22、--删除check约束 alter table tb_student Drop constraint ck_sex
数据完整性总结1、--Primary key 约束--非聚集索引不超过个,聚集索引最多个--primary key未指定索引,索引类型与Unique相同--Primary key的所有列必须非空not null2、--Unique约束--默认使用nonclustered--每个Unique都生成一个索引,非聚集索引不超过,聚集索引最多个3、--Foreign key--Foreign key列输入非空值,该值必须在被引用列中存在--Foreign key约束仅能引用同一服务器的数据库表,跨数据库的引用必须通过触发器实现--列级的Foreign key约束的references子句只能列出一个引用列,且数据类型必须相同--表级Foreign key约束的references子句引用列的数目必须与约束列的列数相同,没个列的数据类型必须相同--类型为timestamp的列是外键、被引用键的部分,不能指定cascade、set Null、set default--临时表不强制Foreign key约束--Foreign key只能引用所引用的表的Primary key或unique 约束中的列,或引用的表上的Unique Index中的列4、--Default定义--每列只能有一个Default定义--Default定义可以包含常量值,函数,或Null--不能对类型为timestamp的列,或自增长型的列,创建Default定义5、--Check约束--列级Check约束只能引用被约束的列,表级Check约束只能引用同一表中的列--不能在text、ntext、或image列上定义check约束6、--其他约束相关信息--为约束创建的索引不能用Drop Index删除,必须用Alter table删除约束--如果某个表有约束以及触发器,则将在触发器执行前先检查约束条件--若要获得关于表及其列的报表,请使用sp_help或sp_helpconstraint表名--若要获得与表相关的视图和存储过程的报表,请使用sp_depends--若列为计算列,是否为空由系统确定。使用带AllowsNull属性的ColumnProperty函数
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|