Mysql基础02-约束

约束与索引

概念

一、数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。mysql

  • 实体完整性(Entity Integrity):例如,同一个表中,不能存在两条彻底相同没法区分的记录sql

  • 域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”数据库

  • 引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门工具

  • 用户自定义完整性(User-defined Integrity):例如:用户名惟1、密码不能为空等spa

二、约束指针

  • 键约束:主键约束、外键约束、惟一键约束code

  • Not NULL约束:非空约束orm

  • Check约束:检查约束blog

  • Default约束:默认值约束排序

  • 自增约束

三、约束(CONSTRAINTS)与索引(INDEX)

约束是用来对数据业务规则和数据完整性进行实施、维护。约束的做用范围仅限在当前数据库,是逻辑约束,不会由于设置约束而额外占用空间。

索引是一个单独、物理的存储在数据页上的数据库结构,它是表中一列或若干列值的集合和相应的指向表中数据值的物理标识数据页的逻辑指针清单(相似于新华字典的目录索引页)。能够大大提升查询速度。应该在键列、或其余常常要查询、排序、按范围查找的列上创建索引。

Mysql会在主键、惟一键、外键列上自动建立索引,其余列须要创建索引的话,须要手动建立。

其中主键删除,对应的索引也会删除

删除惟一键的方式是经过删除对应的索引来实现的

删除外键,外键列上的索引还在,若是须要删除,须要单独删除索引

查看某个表的约束

SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
或
SHOW CREATE TABLE 表名;

查看某个表的索引

SHOW INDEX FROM 表名称;

主键约束:primary key

主键分为单列主键和复合主键

主键的特色

(1)惟一而且非空(2)一个表只能有一个主键约束(3)主键约束名就叫作PRIMARY(4)建立主键会自动建立对应的索引,一样删除主键对应的索引也会删除。

建表时指定主键约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  ....
);
或
create table 【数据名.】表名(
  字段名1 数据类型,
  ....,
  primary key(字段名1)
);
或
create table 【数据名.】表名(
  字段名1 数据类型,
  字段名2 数据类型,
  ....,
  primary key(复合主键字段列表)  #若是是复合主键,那么就须要在全部字段列表后面使用这种形式指定,不能在字段后面直接加primary key
);

建表后指定主键约束

alter table 表名称 add primary key (主键字段列表);

删除主键约束

alter table 表名称 drop primary key;

惟一键约束:unique key

惟一键约束特色:

(1)同一个表能够有多个惟一约束。(2)惟一约束能够是某一个列的值惟一,也能够多个列组合值的惟一。(3)MySQL会给惟一约束的列上默认建立一个惟一索引。(4)删除惟一键只能经过删除对应索引的方式删除,删除时须要指定惟一键索引名

建表时指定惟一键约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 unique key,
  ....
);

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型,
  字段名3 数据类型,
  ....,
  unique key(复合惟一字段列表)  #若是是复合惟一键,那么就须要在全部字段列表后面使用这种形式指定,不能在字段后面直接加unique key
);

建表后增长惟一键约束

alter table 表名称 addconstraint 约束名】 uniquekey】 (字段名列表);

#若是没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,若是是多个字段的默认是字段名列表的第1个字段名。

删除惟一键约束

ALTER TABLE 表名称 DROP INDEX 惟一键约束名;

外键约束:foreign key

外键特色:

  • 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

  • 在建立外键约束时,若是不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也能够指定外键约束名。

  • 当建立外键约束时,系统默认会在所在的列上创建对应的普通索引。可是索引名是列名,不是外键的约束名。

  • 删除外键时,关于外键列上的普通索引须要单独删除。

要求

  • 在从表上创建外键,并且主表要先存在。

  • 一个表能够创建多个外键约束

  • 从表的外键列,在主表中引用的只能是键列(主键,惟一键,外键),推荐引用主表的主键。

  • 从表的外键列与主表被参照的列名字能够不相同,可是数据类型必须同样

约束关系:约束是针对双方的

添加了外键约束后,主表的修改和删除受约束

添加了外键约束后,从表的添加和修改受约束

5个约束等级

  • Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  • Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,可是要注意子表的外键列不能为not null

  • No action方式:若是子表中有匹配的记录,则不容许对父表对应候选键进行update/delete操做

  • Restrict方式:同no action, 都是当即检查外键约束

  • Set default方式(在可视化工具SQLyog中可能显示空白):父表有变动时,子表将外键列设置成一个默认的值,但Innodb不能识别

若是没有指定等级,就至关于Restrict方式

建表时指定外键约束

create table 【数据名.】从表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 【unique key】,
  ....,
  【constraint 外键约束名】 foreign key (从表字段) references 主表名(主表字段) 【on update 外键约束等级】【on delete 外键约束等级】
);

#外键只能在全部字段列表后面单独指定
#若是要本身命名外键约束名,建议 主表名_从表名_关联字段名_fk

建表后指定外键约束

alter table 从表名称 addconstraint 外键约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】【on delete xx】;

删除外键约束

ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;

#删除外键约束不会删除对应的索引

删除索引

ALTER TABLE 表名称 DROP INDEX 索引名;

非空约束:not null

规定某个字段不能为空

建表时指定非空约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 【unique key】 【not null】,
  字段名2 数据类型 【not null】,
  ....,
);

建表后指定非空约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULLdefault 默认值】;

#若是该字段原来设置了默认值约束,要跟着一块儿再写一遍,不然默认值约束会丢失

删除非空约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;

#若是该字段原来设置了默认值约束,要跟着一块儿再写一遍,不然默认值约束会丢失

默认值约束:default

建表时指定默认约束

create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 【unique key】 【not null】 【default 默认值】,
  字段名3 数据类型 【not null】 【default 默认值】,
  ....,
);

建表后指定默认值约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】 【NOT NULL】;

#若是该字段原来设置了非空约束,要跟着一块儿再写一遍,不然非空约束会丢失

删除默认值约束

ALTER TABLE 表名称 MODIFY 字段名 数据类型 【NOT NULL】;

#若是该字段原来设置了非空约束,要跟着一块儿再写一遍,不然非空约束会丢失

检查约束,mysql暂不支持

自增约束:auto_increment

特色:

  • 一个表最多只能有一个自增加列

  • 自增加列必须是键列(主键列,惟一键列,外键列),而且要求非空。

  • 自增列必须是整数类型

  • InnoDB表的自动增加列能够手动插入,可是插入的值若是是空或者0,则实际插入的将是自动增加后的值。

建表时指定自增加

create table 【数据名.】表名(
  字段名1 数据类型 primary key auto_increment,
  字段名2 数据类型 【unique key】 【not null】 【default 默认值】,
  ....
);
或
create table 【数据名.】表名(
  字段名1 数据类型 primary key ,
  字段名2 数据类型 【unique key not null】 auto_increment,
  ....
);

建表后指定自增加

alter table 【数据名.】表名 modify 自增字段名 数据类型 auto_increment;

删除自增约束

alter table 【数据名.】表名 modify 自增字段名 数据类型;

添加数据时,若是某列有自增约束,怎么添加该字段的值

insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应自增列能够赋值为null和0
insert into 【数据库名.]表名称(部分字段列表) values(值列表);#自增列在(部分字段列表)中不写就能够

添加数据时,若是某列有默认值约束,怎么添加、修改该字段的值

insert into 【数据库名.]表名称 values(值列表);#在值列表中,对应默认值列,若是想用默认值,用default

insert into 【数据库名.]表名称(部分字段列表) values(值列表);#对应默认值列,若是想用默认值,在(部分字段列表)中不写就能够

修改数据

update 【数据库名.]表名称 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 条件】; #对应默认值列,若是想用默认值,写字段名 = default就能够
相关文章
相关标签/搜索