SQL基础-约束&索引

一、约束

1、约束简介

约束(constraint):
    表中数据的限制条件。 完整性   有效性


约束的种类:
    主键约束
    外键约束
    唯一约束
    检查约束
    非空约束


2、主键约束

主键约束:
    唯一标识表中每一行的一列或多个列,可以定义一列或多列为主键;
    主键列上没有任何两行具有相同值(即重复值),不允许空(NULL);
    主健可作外健,唯一索引不可;
    不能或者很难更新;


定义表的主键:
方法一:建表时定义
CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号',
PRIMARY KEY(student_id)
)COMMENT='学生';


方法二:建表后创建
REATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号'
)COMMENT='学生’;

ALTER TABLE student ADD PRIMARY KEY(student_id);


3、外键约束

外键约束:
    约定某一列的值必须出现在另一个表的主键中;
    表的外键是另一表的主键, 外键可以有重复的, 可以是NULL;
    用来和其他表建立联系用的;
    一个表可以有多个外键;


方法一:建表时创建
CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号',
FOREIGN KEY(teacher_id) REFERENCES teacher(teacher_id)
)COMMENT='学生';


方法二:建表后创建
CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号'
)COMMENT='学生’;

ALTER TABLE student ADD FOREIGN KEY(teacher_id) REFERENCES teacher(teacher_id);


4、唯一约束

唯一约束:
    约定某一列或某几列的值在表中不重复。

唯一约束和主键约束的区别:
    唯一性约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。

 约束和索引:
    前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同;



#创建唯一约束
方法一:UNIQUE关键字,这种直接定义在列名后,适合单字段
CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名' UNIQUE,
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号'
)COMMENT='学生';


方法二:定义在最后,可以指定多个字段唯一
CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号',
UNIQUE (calss_id,student_name)
)COMMENT='学生';


5、检查约束

检查约束:
    约定某一列的值必须满足指定的条件。

与其他约束不同,MySQL虽然支持CHECK约束,但并没有强制限制。也就是说,违反约束的数据也会被接受。


CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄' CHECK ( age >= 10 AND age <= 20 ),
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号'
)COMMENT='学生';


6、非空约束

非空约束:
    约定某一列的值不可为NULL。

CREATE TABLE student (
student_id varchar(50) NOT NULL COMMENT '学生编号',
student_name varchar(100) NOT NULL DEFAULT '' COMMENT '学生姓名',
gender varchar(10) NOT NULL DEFAULT '' COMMENT '性别',
birth_day date NOT NULL COMMENT '生日',
age int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
class_id varchar(50) NOT NULL DEFAULT '' COMMENT '班级编号',
score decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '数学成绩',
teacher_id varchar(20) DEFAULT NULL COMMENT '老师编号'
)COMMENT='学生';


二、索引

1、索引

索引定义:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,

数据库索引是用于提高数据库表的数据访问速度的。

数据库索引的特点:

    a)避免进行数据库全表的扫描,大多数情况,只需要扫描较少的索引页和数据页,而不是查询所有数据页。而且对于非聚集索引,有时不需要访问数据页即可得到数据。

    b)聚集索引可以避免数据插入操作,集中于表的最后一个数据页面。

    c)在某些情况下,索引可以避免排序操作。


索引背后的数据结构基础是b tree或者 b+ tree,后续有机会再详细看;


2、索引的创建及使用

比如:
    查询2006年6月12日出生的学生有哪些?

    SELECT * FROM student WHERE birth_day = '2006-06-12';


如果birth_day这一列查询频率很高,可以创建索引:

    CREATE INDEX idx_birth_day ON student(birth_day);


#为多个列创建索引
    CREATE UNIQUE INDEX idx_2 ON student(class_id,student_name);
    SELECT * FROM student WHERE class_id = 'G0102' AND student_name = '牛思静';


3、删除索引

比如:删除student表上创建的名为idx_2的索引:
    
    DROP INDEX idx_2 ON student;


4、索引的优缺点

优点:
 提高查询(SELECTGROUP BYORDER BY)速度;
 唯一索引可保证数据唯一性;

缺点:
 创建的索引需要占用物理存储空间;
 建立并维护索引需要花费时间,且随着表中数据量的增加,花费的时间也会增加;

猜你喜欢

转载自www.cnblogs.com/weiyiming007/p/11446005.html