数据库学习2-范式
2014-07-08 21:13
204 查看
1. 约束的概念约束:对表中数据的限制性;constraint;2. 约束的作用约束的作用:就是为了保证数据的完整性和一致性列完整性(域完整性)、行完整性(实体完整性)、引用完整性3. 约束的类型:主键约束、非空约束、唯一约束、检查约束、外键约束、default主键约束:保证实体完整性,非空、唯一;关键字:primary key1NF(第一范式):列不可再分 2NF(第二范式):必须要有主键非空约束:NOT NULL;主键约束和唯一约束的区别:只能有一个主键约束,唯一约束可以 有多个,唯一约束可以为null,而主键约束不能为null外键约束:约束从表引用,当主表被从表引用时,主表不能被删除
CREATE TABLE tab_name ( column1 NUMBER, column2 VARCHAR2(10) ) --范式: 第一范式(1NF) 列不可再分 -- 第二范式(2NF) 不存在非关键列对关键列的部分函数依赖 -- 1.必须有主键;2.主键可以作为所有非主键列的唯一性标识 --约束: 对数据的完整性和一致性的要求 --约束类型: 主键约束(行完整或实体完整)、非空约束(列完整或域完整)、唯一约束、检查约束(列完整或域完整)、外键约束(引用完整) --非空约束: not null DROP TABLE student2; CREATE TABLE student2 ( NAME VARCHAR2(10) NOT NULL --非空约束 ) INSERT INTO student2 VALUES(''); --唯一约束: unique ,要求数据不能重复 DROP TABLE student2; CREATE TABLE student2 ( NAME VARCHAR2(10) NOT NULL, --非空约束 idcode VARCHAR2(20) UNIQUE --唯一约束 格式:constraint 约束名 unique ) INSERT INTO student2 VALUES('张三','200000'); SELECT * FROM student2; --检查约束: check, 通过表达式完成对数据要求的描述 DROP TABLE student2; CREATE TABLE student2 ( NAME VARCHAR2(10) NOT NULL, --非空约束 idcode VARCHAR2(20) UNIQUE, --唯一约束 格式:constraint 约束名 unique age NUMBER CHECK(age>=0 AND age<50), --检查约束 格式:constraint 约束名 check(表达式) sex VARCHAR2(2) CONSTRAINT ck_sex CHECK(sex='男' OR sex='女') ) INSERT INTO student2 VALUES('张三','200000',49,'公'); --主键约束: primary key, 作为数据的唯一性标识,保证数据的行完整性(实体完整性) DROP TABLE student2; CREATE TABLE student2 ( stu_no NUMBER, idcode VARCHAR2(10), NAME VARCHAR2(10) NOT NULL, score NUMBER, PRIMARY KEY(stu_no,idcode) ) --主键约束和唯一约束的区别: -- 1. 主键约束要求数据唯一并且非空 -- 2. 主键约束只能有一个,唯一约束可以有多个 DROP TABLE student2; CREATE TABLE student2 ( s_id NUMBER PRIMARY KEY, --主键约束,建议用一个数值型的没有意义的字段作为主键 NAME VARCHAR2(10) NOT NULL, idcode VARCHAR2(20) UNIQUE, --唯一约束 格式:constraint 约束名 unique age NUMBER CHECK(age>=0 AND age<50), --检查约束 格式:constraint 约束名 check(表达式) sex VARCHAR2(2) CONSTRAINT ck_sex CHECK(sex='男' OR sex='女') ) --外键约束: foreign key , 被引用的表(clazz班级表)必须有主键约束或唯一约束 CREATE TABLE clazz --班级表 ( c_id NUMBER PRIMARY KEY, c_name VARCHAR2(20) NOT NULL ) DROP TABLE student2; CREATE TABLE student2 ( s_id NUMBER PRIMARY KEY, --主键约束,建议用一个数值型的没有意义的字段作为主键 NAME VARCHAR2(10) NOT NULL, idcode VARCHAR2(20) UNIQUE, --唯一约束 格式:constraint 约束名 unique age NUMBER CHECK(age>=0 AND age<50), --检查约束 格式:constraint 约束名 check(表达式) sex VARCHAR2(2) CONSTRAINT ck_sex CHECK(sex='男' OR sex='女'), c NUMBER REFERENCES clazz(c_id) --外键约束 格式:foreign key 约束名 refernces 被引用表名(字段名) ) INSERT INTO clazz VALUES(1,'1229班'); INSERT INTO clazz VALUES(2,'1110班'); INSERT INTO clazz VALUES(3,'1109班'); SELECT * FROM clazz; INSERT INTO student2 VALUES(10,'张三','20000001',20,'男',3); INSERT INTO student2 VALUES(12,'梁宽','20000002',19,'男',1); INSERT INTO student2 VALUES(13,'李四','20000003',20,'女',2); INSERT INTO student2 VALUES(15,'姚振','20000006',20,'男',2); SELECT * FROM student2; --alter table 维护约束 --建表后添加约束(格式):alter table 表名 add constraint 约束名 primary key(字段名) ALTER TABLE student ADD CONSTRAINT pk_student PRIMARY KEY(idcode); ALTER TABLE student ADD CONSTRAINT uniq_name UNIQUE(NAME); ALTER TABLE student ADD CONSTRAINT ck_age CHECK(age>0 AND age<50); --ALTER TABLE student ADD c NUMBER; ALTER TABLE student ADD CONSTRAINT fk_student_clazz FOREIGN KEY(c) REFERENCES clazz; --建表后添加非空约束(格式):alter table 表名 modify 字段名 not null; ALTER TABLE student MODIFY sex NOT NULL; --设置约束有效和失效 ALTER TABLE student DISABLE CONSTRAINT uniq_name; -- 设置失效 ALTER TABLE student MODIFY CONSTRAINT uniq_name DISABLE; ALTER TABLE student ENABLE CONSTRAINT uniq_name; -- 设置生效 ALTER TABLE student MODIFY CONSTRAINT uniq_name ENABLE; --删除约束 ALTER TABLE student DROP CONSTRAINT uniq_name; --查看约束 SELECT * FROM all_constraints;
--练习:创建两个表:订单表 客户表 ,并且建立对应的约束 订单:订单编号;主键约束订单类型;订单所属客户 外键约束<span style="white-space:pre"> </span>客户:客户编号;主键约束客户姓名;