约束、索引、三范式

1.约束的定义:

  约束(constraint):在建表时,为某些列添加一些特定的规则,这些规则称为约束。约束是在表上强制执行的数据校验规则保证数据库的数据满足某种用户的要求。添加约束之后,再往表中(插入、更新)数据时,如果数据不满足约束,则该条语句不能执行。

2.约束的分类:

2.1 非空约束 not null

非空约束确保字段值不允许为空
非空约束只能在字段级定义

-- not null 非空约束
--添加了 not null的列的值不能为null,但可以是空格
create table test01(
empno number(4) ,
ename varchar2(10) not null
)

2.2 唯一约束 unique

唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现空值

--unique 唯一键约束
--添加了unique 约束的列的值是唯一的,不能出现重复的值,但可以有多个null值
create table test02 (
empno number(4) unique,
 ename varchar2(10)
 );
--非空且唯一
--允许同时添加not null和unique表示不能重复并且不能为null
create table test03 (
empno number(4) not null unique,e
name varchar2(10) );

2.3 自定义检查约束 check

check约束用于对一个属性的值加以限制。
在check中定义检查的条件表达式,在对数据进行插入或修改需要符合设置的条件。

--check 自定义检查约束
--在插入或修改数据时,值要符合check中定义的条件
create table test04(
empno number(4),
ename varchar2(10),
age number(3) check(age>0 and age<200),
gender varchar2(3) check(gender=‘男‘ or gender=‘女‘)
)

2.4 主键约束 primary key

主键约束是数据库中最重要的一种约束。在关系中,主键值不可为空,也不允许出现重复,即关系要满足实体完整性规则。
– 主键从功能上看相当于非空且唯一
– 一个表中叧允许一个主键
– 主键是表中能够唯一确定一个行数据的字段
– 主键字段可以是单字段戒者是多字段的组合(联合主键)
– Oracle为主键创建对应的唯一性索引

--主键约束从形式可看成类非空且唯一
create table test05(
empno number(4) primary key,
ename varchar2(10)
)
--联合主键
--一张表只有一个主键,但可以选择多个列,作为联合主键
create table test06(
empno number(4),
ename varchar2(10),
constraint pk_no_name primary key(empno,ename)
--在列中添加约束可以不给约束命名,没有命名系统会自动命名
--在表中添加约束就需要手动命名
)

2.5 外键约束 foreign key

外键是表中的一个列,它的值依赖于另一张表的主键或者唯一键被依赖的表称为主表,

存在外键的表称为从表外键的值必须是主表(指定的)主键或者唯一键中列出

注:
对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:当要删除主表的某个主键值(依赖的,那么对依赖的影
响可采取下列3种做法:
1. RESTRICT方式(默认,无法删除):只有当从表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。
2. CASCADE方式(联级删除):将从表中所有外键值与主表中要删除的主键值相对应的记录一起删除
3. SET NULL方式(设置为空):将从表中所有与主表中被删除的主键值相对应的外键值设为空值

添加外键约束语法:
外键列 REFERENCES 表名(主键列)
[ON DELETE [CASCADE|SET NULL]] 如省略on短语,默认按第一种处理方式。

--主表
create table t_dept(
deptno number(2) primary key,
dname varchar2(12)
)

--从表
create table t_emp(
empno number(4),
ename varchar2(10),
--添加外键,指定主键删除处理方式
deptno number(2) references t_dept(deptno) on delete set null
) 

3.添加和修改约束

可增加或删除约束,但不能直接修改
语法:
增加
alter table 表名 add constraint 约束名 unique(列名)
删除
alter table 表名 drop constraint 约束名 [cascade] (加了cascade就为联级删除)

4.索引

4.1 概念:

索引是为了加快对数据的搜索速度而设立的。类似于一本书的目录,数据库对表数据进行查询时可以通过索引快速定位到数据。索引是非显示的,在创建之后不会再用到,但查询数据时索引会自动起作用。

4.2 索引创建的两种情况:

1. 自动: 当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条件时,Oracle数据库自动创建一个对应的唯一索引。
2. 手动: 手动在某个或多个列上创建索引以加速查询
语法:CREATE INDEX index 索引名 ON 表名 (列1[,列2]...);
在多个列上创建索引时,需要对多个列同时进行查询,索引才会起作用

4.3 使用索引需注意:

1. 索引提高检索操作的性能,但降低数据插入、修改和删除的性能。在执行这些操作时,DBMS(数据库管理系统)必须动态地更新索引。
2.索引数据可能需要占用大量空间
3.经常出现重复的数据不适合使用索引
4.在多个列上创建索引时,需要对多个列同时进行查询,索引才会起作用

4.4 删除索引:

语法: drop index 索引名

5. 数据库设计三范式:

数据库的设计主要包含了设计表结构和表之间的联系,在设计的过程中,应该遵守三范式:
第一范式:数据库表中的每一个列都必须是不可分割的基础数据项。例如:“地址”应该拆分成省份、城市、详细地址等多个部分进行存储
第二范式:确保表中每列都与主键相关
第三范式:一个数据库表中不能包含已在其它表中已包含的非主关键字信息。

原文地址:https://www.cnblogs.com/gaojinshun/p/10744134.html

时间: 2024-12-26 13:03:57

约束、索引、三范式的相关文章

数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

存储引擎概念数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能.现在许多不同的数据库管理系统都支持多种不同的数据引擎. 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated . InnoDB(B+树) InnoDB 底层存储结构为B+树, B树的每个节点对应i

oracle(sql)基础篇系列(四)&mdash;&mdash;数字字典、索引、序列、三范式

  数字字典表 --查看当前用户下面有哪些张表 select * from user_tables; select table_name from user_tables;   --查看当前用户下面有哪些视图 select * from user_views; select view_name from user_views;   --查看当前用户下面有哪些约束 select * from user_constraints; select constraint_name from user_co

数据库---视图,触发器,事务,存储过程 ,函数,流程控制, 索引与慢查询优化,测试索引,数据库三范式(简介)

视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调 1.在硬盘中,视图只有表结构文件,没有表数据文件 2.视图通常是用于查询,尽量不要修改视图中的数据 drop

mysql监控、性能调优及三范式理解

原文:mysql监控.性能调优及三范式理解 1监控 工具:sp on mysql     sp系列可监控各种数据库 2调优 2.1 DB层操作与调优 2.1.1.开启慢查询 在My.cnf文件中添加如下内容(如果不知道my.cnf的路径可使用find / -name my.cnf进行查找): 在mysqld下添加 Log_slow_queries = ON  作用:开启慢查询服务 Log-slow-queries = /var/log/slowqueries.log 作用:慢查询日志存储路径.

你真的会玩SQL吗?三范式、数据完整性

每次上新功能时都需要添加新表,这时就要涉及到表结构的设计,那就要提到三范式,对于三范式教科书上说得很绕口,那简单点的呢?  三范式 第一范式:属性不可分,不允许存在隐藏字段,属性保持“原子性” 第二范式:要有主键.为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识. 第三范式:要求一个数据库表中不包含已在其它表中已包含的非主关键字信息. 正规化范式(BCDF):所有表中的决定因素必须是一个候选键,如果只有一个候选键,那么就和第三范式是一样的. 第四范式(4NF):消除多值依赖. 第五范式

数据库三范式的理解

画好e-r图,简单的设计好表结构以后,就需要进行三范式检验. 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解: 即表中所有字段仅包含单值.(反例,用户表中一个人可能有多个银行账户,多个值存储同一单元,违反1NF).第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性: 要求数据表中每个记录或实例需要唯一区分(引入id),要求实体属性完全由主键决定,而且是完全依赖,即如果主键有2个字段,仅由其中一个主键决定的就违反2NF.第三范式:3NF是对字段冗余性的约

SQL 三范式

第一范式:无重复的列,一列只能包含一个字段 第二范式:主键约束,一行只能被唯一标识 第三范式:非主键字段要严格依赖于主键字段 SQL 三范式 原文地址:https://www.cnblogs.com/share23/p/9782986.html

数据库三范式、事务

三范式 第一范式(1NF) 在一张表中,组成表的每一个属性都是不能再分的属性,如果满足这一规则,则该表符合第一范式.                  表1(不符合)                                                    表2(符合) 表1的Info字段可以再拆分,故不符合1NF:表2所有属性不可再分,符合. 第二范式(2NF) 首先要满足1NF,表中的每一个非主属性必须完全依赖于本表的主键(候选键),而不能是部分依赖.              

数据库设计时不得不违背三范式的情景

1.在进销存系统中,订单信息中关联到好多其他的基本信息,比如:客户,付款方式,货运方式等,这些信息是有专门表进行维护的,在下订单时也是用下拉框选择的,但在保存订单信息时,不能只记录所谓的外键ID,而是应该同时记录名称等其他的信息. 这是因为订单不能因为没有了客户ID或是付款方式ID而不知道客户与付款方式了.对于订单这种客观存在的事物,是具有一定的历史性质的,因此在设计时应该与其他的关联信息可以“断开”,这也就是保证了订单的独立性. 摘自:http://www.cnblogs.com/tongtk