每天一点数据库之-----Day 8 索引与约束

每天一点数据库之-----Day 8 索引与约束

----转载请注明出处:coder-pig

1.索引

这个SQL中的索引,前面我们也提过了,使用索引可以提高数据的检索速度,

而关于索引还是比较复杂的,一些概念,比如表组织,堆,数据,数据也,B树等,还有两种

类型的索引:"聚集索引"与"非聚集索引"等,鉴于看本文的都是一些初学者,也只是了解

下数据库的一些常用知识,这里讲解下创建索引与删除索引,有更深层次需求的朋友

可自行百度~

①创建索引:

索引是针对字段的,创建索引时需要指定在那个字段上创建索引,

还可以为多个字段创建一个索引,如:

CREATE INDEX idx_person_name ON T_Person(FName)

或者为多个字段创建索引

CREATE INDEX idx_person_union ON T_Person(FName,Fage,FSex)

②删除索引

接下来把之前创建的索引删掉,很简单:

DROP INDEX T_Person.idx_person_name;
DROP INDEX T_Person.idx_person_union;

2.约束

一般我们在创建数据库表的时候,会为字段定义一个数据类型,虽然规定了一个字段

能存放的数据类型,但是确实远远不够的,例如在录入人员信息时,由于疏忽忘记填写

Name字段,结果就出现了一个没名字的记录,即数据库中的数据遭到污染,为了避免不

正确的数据保存到数据库表中,我们需要在数据库中制定一些约束条件,从而保证数据

的正确性,比如年龄不能为负数等!

①非空约束:

就是设置某个字段不允许为空,只需在字段定义后添加:NOT NULL

比如创建一个测试表:

CREATE TABLE T_Test(FOne INTEGER NOT NULl)

接下来执行下述SQL插入一条数据:

INSERT INTO T_Test(FOne)VALUES(NULL);

执行上述SQL:

PS:除了INSERT插入空值会失败外,UPDATE更新 = NULL也是会失败的!

②唯一约束:

就是字段中的值只能是唯一的,只需在字段定义后添加:UNIQUE

1)单字段唯一

先把前面创建的T_Test表DROP掉!接着执行下述建表语句:

CREATE TABLE T_Test(FOne INTEGER UNIQUE,FTwo VARCHAR(20))

往表中插入数据:

INSERT INTO T_Test(FOne,FTwo)VALUES(1,'测试1');
INSERT INTO T_Test(FOne,FTwo)VALUES(1,'测试2');

运行上述SQL:

2)复合唯一约束:

就是要多个字段同时唯一,在录入员工信息时,可能出现重名现象,比如两个叫Tom的人,但是他们是

不同部门的,这个时候可以使用符合唯一约束,只有两个相同了,才算重复记录!

这个时候就可以使用:

CONSTRAINT复合唯一约束名称 UNIQUE(部门字段,姓名字段)

当括号中的字段都相同,才算重复,即插入和更新时括号中的字段的值都相同就会报错!

至于这个约束名称你想怎么写都可以~

③CHECK约束:

就是写入数据前判断字段是否符合条件,如果不满足条件,那么这个对数据库的修改不会成功!

比如下面一个简单的例子:(先把前面的表DROP掉哦!)

创表SQL:

CREATE TABLE T_Test(FOne INTEGER,FTwo INTEGER CHECK(FTwo > 0))

插入SQL:

INSERT INTO T_Test(FOne,FTwo)VALUES(1,-1)

运行上述SQL:

另一个实用的例子:是否为手机号码,即手机位数需要等于11

建表SQL:

CREATE TABLE T_Test(FOne Integer,FNum VARCHAR(20) CHECK(LEN(FNum)=11))

插入SQL:

INSERT INTO T_Test (FOne,FNum)VALUES(1,'13765653324');
INSERT INTO T_Test (FOne,FNum)VALUES(1,'137656533245');

运行SQL:

④主键约束:

主键约束的重要性就不用说了,前面也介绍过了,就是在字段后添加PRIMARY KEY关键字即可!

创建时如何设置主键,这个前面说过很多遍了,就不写了,这里只演示如何为已创建的表设置主键

SQL语句如下:

ALTER TABLE T_Test ADD PRIMARY KEY(FOne)

⑤外键约束:

和主键一样,在Day2创建数据库表就已经介绍了如何创建外键了!

例子:

当然和主键一样,我们可能一开始并没有位表创建外键,也是通过ALTER来为表添加外键:

ALTER TABLE 表名
ADD CONSTRAINT 外键约束名
FOREIGN KEY(列名) REFERENCES 引用外键表(列名)

最后说两句:

关于SQL中的索引与约束的知识点就介绍到这里~

时间: 2024-10-08 09:10:42

每天一点数据库之-----Day 8 索引与约束的相关文章

数据库为何要建立索引的原因说明

数据库索引是为了增加查询速度而对表字段附加的一种标识.见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处. 这里想把之前的索引学习笔记总结一下: 首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合.如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度.那么在任何时候都应该加索引么?这里有几个反例:1.如果每次都需要取到所有表记录,无论

MySQL 数据库性能优化之索引优化

这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 索引为什么能提高数据访问性能? 很多人只知道索引能够提高数据库的性能,但并不是特别了解其原理,其实我们可以用一个生活中的示例来理解. 我们让一位不太懂计算机的朋友去图书馆确认一本叫做<MySQL性能调优与架构设计>的书是否在藏,这样对他说:"请帮我借一本计算机类的数据库书籍,是属于 MySQL 数据库范畴的,叫做<MySQL性能调优与架构设计>".朋友会根据所属类别,前往

重新学习MySQL数据库4:Mysql索引实现原理

重新学习Mysql数据库4:Mysql索引实现原理 MySQL索引类型 (https://www.cnblogs.com/luyucheng/p/6289714.html) 一.简介 MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二.语句 CREATE TABLE table_name[col_name data type][unique|fulltext][index|key][index_name](col_name[lengt

每天一点数据库之-----Day 9 表连接

每天一点数据库之-----Day 9 表连接 ----转载请注明出处:coder-pig 本节引言: 前面我们学习的都是针对一个表来进行操作的,上一节虽然学了UNION这个可以操作多个表 的关键字,但是又有两个限制(查询字段数目与数据类型要相同),本节就来学习通过表连接 来操作多个表!而表连接又有四种: 内连接,外连接,交叉连接与自连接,那么接下来开始本节学习! 数据准备: 在开始学习前,我们先准备一些数据,建三个表:T_Stu,T_Class,T_Dorm 建T_Stu表: CREATE TA

每天一点数据库之-----Day 7 字段相关与联合结果集

每天一点数据库之-----Day 7 字段相关与联合结果集 ----转载请注明出处:coder-pig 一.字段相关 1.常量字段: 什么是常量字段? 答:就是表中并不存在的字段,但是查询出来的结果看上去上实际存在~如 使用下述SQL: SELECT '小明超市','香洲店',PName,PPrice FROM T_Product 运行SQL: 这里的'小明超市'和'香洲店'就是常量字段!! 2.字段间的计算 字段间还可以进行计算,如计算商品的总价: SELECT PName,FNum,PPri

每天一点数据库之-----Day 4 数据的简单查询

每天一点数据库之-----Day 4 数据的增改删 ----转载请注明出处:coder-pig 本节引言: 本节介绍的是最简单的数据检索(查询),就是SELECT的最基本用法~ 针对本节查询,我们先建立一个工作人员表,以及录入一些几条记录: 包括,人员id,人员姓名,年龄,性别,工资,以及部门名称: 建表SQL: CREATE TABLE T_Worker ( FId INTEGER , FName VARCHAR ( 20), FAge INTEGER , FSex VARCHAR (10),

关于数据库表中的索引及索引列的CRUD

-- 查询一个数据库表中的索引及索引列use [RuPengWangDB]GOSELECT  indexname = a.name , tablename = c. name , indexcolumns = d .name , a .indidFROM    sysindexes a JOIN sysindexkeys b ON a .id = b .id  AND a .indid = b.indid        JOIN sysobjects c ON b .id = c .id    

每天一点数据库之-----Day 6 数据分组与数据分页

每天一点数据库之-----Day 6 数据分组与数据分页 ----转载请注明出处:coder-pig 本节引言: 本节继续来学习SQL中的数据查询中的数据分组~ 先建个表,录几条数据,顺道复习下之前学的内容~ 之前建立的T_Worker都用了几天了,今天就来弄个新的表吧T_Product商品表: 建表SQL: CREATE TABLE T_Product ( PId INTEGER, PName VARCHAR(20), PKind VARCHAR(20), PCity VARCHAR(10),

每天一点数据库之-----Day 3 数据的增改删

每天一点数据库之-----Day 3 数据的增改删 ----转载请注明出处:coder-pig 本节引言: 本节介绍的是,往数据库中添加数据,更新数据以及删除数据 1)往表中添加数据: 上一节,我们把T_Person表给删除了,先创建一个T_Person表,顺道复习下: CREATE TABLE T_Person ( FId INTEGER NOT NULL, FName VARCHAR (20), FAge INTEGER , FSex VARCHAR (10) PRIMARY KEY (FI