http://xinxinyin666./blog/view/226237927.htm
主键(primarykey)约束、外键(foreignkey)约束、唯一(unique)约束、检查(check)约束、默认值(default)约束实例
Oracle有如下类型的约束:
NOTNULL(非空)、UNIQUEKey(唯一约束)、PRIMARYKEY(主键约束)、FOREIGNKEY(外键约束)、CHECK约束
Oracle使用SYS_Cn格式命名约束.
创建约束:在建表的同时创建、建表后创建
约束的类型有如下几种:
C(checkconstraintonatable)
P(primarykey)
U(uniquekey)
R(ReferentialAKAForeignKey)
V(withcheckoption,onaview)
O(withreadonly,onaview)
1、创建约束
CREATETABLEstudents(
student_idVARCHAR2(10)NOTNULL,
student_nameVARCHAR2(30)NOTNULL,
college_majorVARCHAR2(15)NOTNULL,
statusVARCHAR2(20)NOTNULL,
stateVARCHAR2(2),
license_noVARCHAR2(30)
)TABLESPACEstudent_data;
2、创建主键:
ALTERTABLEstudentsADDCONSTRAINTpk_studentsPRIMARYKEY(student_id)
USINGINDEXTABLESPACEstudent_index;
Altertabletable_nameaddconstrantsBIDprimarykey(bookno);
ALERTTABLEtable_nameMODIFY(column1PRIMARYKEY);
3、创建Unique约束:
ALTERTABLEstudentsADDCONSTRAINTuk_students_licenseUNIQUE(state,license_no)
USINGINDEXTABLESPACEstudent_index;
4、创建Check约束:定义每一记录都要满足的条件,条件表达式不允许有:CURRVAL,NEXTVAL,LEVEL,ROWNUM,SYSDATE,UID,USER,USERENV函数:
ALTERTABLEstudentsADDCONSTRAINTck_students_st_licCHECK((stateISNULLANDlicense_noISNULL)OR(stateISNOTNULLANDlicense_noisNOTNULL));
添加check约束(check_1为约束名,dept_salary为字段名)
altertableempaddconstraintcheck_1check(dept_salary>0);
5、创建外键约束:
ALTERTABLEstudentsADDCONSTRAINTfk_students_stateFOREIGNKEY(state)REFERENCESstate_lookup(state);
6.创建不能为空约束notnull
altertabletable_namemodify(namenotnull);
altertabletable_namemodifyname1varchar2(20)notnull;
实例1:首先创建学生信息表studentinfo和学生成绩表testinfo。
--学生信息表
CREATETABLEstudentInfo(
stuNoCHAR(10)NOTNULL,
stuNameVARCHAR2(20)NOTNULL,
stuSexNUMBER(1),
stuBirthdayDATEDEFAULTSYSDATE,
stuAddressVARCHAR2(20)
);
--学生成绩表
CREATETABLEtestInfo(
stuNoCHAR(10)NOTNULL,
classNoCHAR(5)NOTNULL,
testScoreNUMBER(3,1)
);
--约束条件:设置主键
altertabletestinfoaddconstraintfk_1foreignkey(stuno)referencesstudentinfo(stuno);
--约束条件:设置外键
altertablestudentinfoaddconstraintpk_1primarykey(stuno);
--约束条件:设置唯一
altertabletestinfoaddconstraintuniq_1unique(stuno,classno);
主键、外键、唯一约束、check约束、非空约束等约束详解实例:1、--创建表
createtabletb_Dept
(
Deptidchar(2)Primarykey,
DeptNamechar(16)NotNull
)
2、--外键约束
createtabletb_Student
(
Studidchar(10)Primarykey,
Studnamechar(8)Notnull,
Deptidchar(2)Notnull,
ConstraintFK_DeptIDForeignKey(Deptid)
ReferencesTb_Dept(DeptID)
)
3、--外键约束简化形式,必须要求tb_Dept表中DeptID为主键,且数值类型相同
createtableTb_Student
(
StudIdchar(10)Primarykey,
StudNamechar(8)Notnull,
DeptIDchar(2)notnullReferencesTb_Dept
)
4、--创建表,无主键
createtableTb_Class
(
ClassIDchar(8)notnull,
ClassNamevarchar(30)notnull,
DeptIdchar(2)notnull,
ClassStuNumberint
)
5、--创建表,同时定义主键
createtableTb_Class
(
classidchar(8)notnull,
ClassNamevarchar(30)notnull,
DeptIDchar(2)notnull,
ClassStuNumberint
constraintPK_ClassIDPrimarykey
(ClassID,ClassName)
)
6、--新增主键
AltertableTb_classADDConstraintPK_ClassIDprimarykey(Classid)
7、--删除主键
Altertabletb_ClassDeleteConstraintPK_ClassIDPrimarykey(ClassID)
8、--外键级联更新,删除,简化形式
Createtabletb_student
(
studIDchar(10)Primarykey,
StudNamechar(10)notnull,
DeptIDchar(2)notnullReferencestb_Dept
OnUpdatecascade
ondeletecascade
)
9、--外键级联更新,删除,标准
createtabletb_student
(
studidchar(10)Primarykey,
StudNamechar(8)notnull,
DeptIDchar(2)notnull,
ConstraintFK_Deptidforeignkey(DeptID)
ReferencesTb_Dept(DeptID)
onupdateCascade
ondeletecascade
)
10、--创建无外键的表
createtabletb_student
(
studIdchar(10)Primarykey,
StudNamechar(8)notnull,
DeptIDchar(2)notNull
)
11、--给相应的列(DeptID)添加外键约束
Altertabletb_StudentADDConstraintFK_DeptIDForeignkey(DeptID)Referencestb_Dept(DeptID)
12、--删除外键约束
Altertabletb_StudentDropConstraintfk_DeptID
13、--创建表是创建Unique约束
Createtabletb_Student
(
studIdchar(10)Primarykey,
Studnamechar(8)notnullUniquenonclustered,
DeptIDchar(2)notnullreferencesTb_Dept
)
createtabletb_student
(
studIDchar(10)Primarykey,
Studnamechar(8)notnull,
deptidchar(2)notnullreferencestb_dept,
constraintUk_StunameUnique(Stuname)
)
14、--创建表结束后,添加、删除Unique约束
--添加Unique约束
altertabletb_StudentADDConstraintUk_DepnameUnique(Deptname)
15、--删除unique约束
Altertabletb_studentDropConstraintuk_Depname
16、--创建默认值约束
Createtabletb_student
(
stuIdchar(10)Primarykey,
stuNamechar(8)notnull,
DeptIDchar(2)Notnullreferencestb_Dept,
sexchar(2)notnulldefault'M',
Birthdaysmalldatetimenotnulldefaultgetdate()
)
17、--添加默认值约束
altertabletb_studentADDconstraintDEF_sexdefault'M'forsex
18、--删除默认值约束
altertabletb_studentDropConstraintDEF_Sex
19、--创建表时,创建check约束
createtabletb_student
(
StudIdchar(10)Primarykey,
Studnamechar(8)notnull,
DeptIdchar(2)notnullreferencestb_Dept,
sexchar(2)notnulldefault'M'check(sexin('M','F')),
zipcodechar(6)notnullcheck(Zipcodelike'[0-9][0-9][0-9][0-9][0-9][0-9]'),
constraintck_StudIDCheck(StudIdlike'S[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
)
20、--check约束的其他例子
check(coursescore>=0andcoursescore<=100)
check(empldlike'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'orempldlike'[A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]')
check(telnoin(?',?',?',?',?')ortelnolike?[0-9][0-9]')
check(salarybetween3000and10000)
check(is_manager=1andsex='F')
check(casewhenis_manager<>1andsex='F')Then1Else0End=0
21、--添加check约束
altertabletb_studentwithnocheckADDConstraintck_Sexcheck(sexin('M','F'))
22、--删除check约束
altertabletb_studentDropconstraintck_sex
数据完整性总结1、--Primarykey约束
--非聚集索引不超过个,聚集索引最多个
--primarykey未指定索引,索引类型与Unique相同
--Primarykey的所有列必须非空notnull
2、--Unique约束
--默认使用nonclustered
--每个Unique都生成一个索引,非聚集索引不超过,聚集索引最多个
3、--Foreignkey
--Foreignkey列输入非空值,该值必须在被引用列中存在
--Foreignkey约束仅能引用同一服务器的数据库表,跨数据库的引用必须通过触发器实现
--列级的Foreignkey约束的references子句只能列出一个引用列,且数据类型必须相同
--表级Foreignkey约束的references子句引用列的数目必须与约束列的列数相同,没个列的数据类型必须相同
--类型为timestamp的列是外键、被引用键的部分,不能指定cascade、setNull、setdefault
--临时表不强制Foreignkey约束
--Foreignkey只能引用所引用的表的Primarykey或unique约束中的列,或引用的表上的UniqueIndex中的列
4、--Default定义
--每列只能有一个Default定义
--Default定义可以包含常量值,函数,或Null
--不能对类型为timestamp的列,或自增长型的列,创建Default定义
5、--Check约束
--列级Check约束只能引用被约束的列,表级Check约束只能引用同一表中的列
--不能在text、ntext、或image列上定义check约束
6、--其他约束相关信息
--为约束创建的索引不能用DropIndex删除,必须用Altertable删除约束
--如果某个表有约束以及触发器,则将在触发器执行前先检查约束条件
--若要获得关于表及其列的报表,请使用sp_help或sp_helpconstraint表名
--若要获得与表相关的视图和存储过程的报表,请使用sp_depends
--若列为计算列,是否为空由系统确定。使用带AllowsNull属性的ColumnProperty函数