数据库学习2-范式

1. 约束的概念

   约束:对表中数据的限制性;constraint;
   
2. 约束的作用
   约束的作用:就是为了保证数据的完整性和一致性
     列完整性(域完整性)、行完整性(实体完整性)、引用完整性
   
3. 约束的类型:主键约束、非空约束、唯一约束、检查约束、外键约束、default
   主键约束:保证实体完整性,非空、唯一;关键字:primary key
            1NF(第一范式):列不可再分 
           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>


客户:
客户编号;主键约束
客户姓名;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值