MySQL-约束(三)

约束的定义

约束是一种限制,它通过对表的行和列的限制,实现准确性、完整性、一致性

常见的约束类型

MySQL中我们常用到的约束有

约束类型 非空约束 唯一约束 默认约束 主键约束 外键约束
关键字 not null unique default primary key foreign key

表级约束与列级约束

  • 表级约束:对多个字段创建约束,在列定义后添加
  • 列级约束:对一个字段创建的约束,可以在列定义时添加也可以通过修改列结构时添加
  • 主键、外键、唯一可作为表级约束也可以作为列级约束
  • 非空、默认只能作为列级约束

例子

下面是例子的表结构,comment为注释,以下的操作均使用本例子

create table me(
id int,
name varchar(20) comment '姓名',
phone varchar(20) comment '手机号',
site varchar(20) comment '地址',
);

非空约束(NOT NULL)

非空约束指定某一字段不能为空,使用非空约束后添加数据时字段不可为空

在创建表时添加非空约束

使用方法直接在字段后面添加非空约束

name varchar(20) not null,

修改表结构时添加非空约束

使用格式:alter table <表名> modify <字段名> <数据类型> not null ;

alter table me modify name varchar(20) not null;

删除非空约束

删除非空约束时和添加一样,修改表结构不加not null就可以

alter table me modify name varchar(20);

唯一约束(UNIQUE)

唯一约束使表中的某一列的数据为唯一,重复即报错,可为空

在创建表时添加唯一约束

使用方法直接在字段后面添加唯一约束

name varchar(20) unique,

修改表结构时添加唯一约束

使用格式:alter table <表名> modify <字段名> <数据类型> unique ;
以下为三种方法,第三种方式中的uk_name为唯一约束名

alter table me modify name varchar(20) unique;
alter teble me add unique(name);
alter table me add constraint uk_name unique(name);

删除唯一约束

alter table me drop index name;
alter table me drop key uk_name;

联合唯一约束

使多个字段(列)联合一起的唯一约束,联合唯一约束就要使用到了表级约束
以下添加name,phone的联合唯一约束,表示name和phone联合是唯一的,单个不唯一
添加一条数据时name与phone与数据中的name与phone都相同时出现报错,只有name或者phone相同不会报错

alter table me add constraint uk_phone unique(name,phone);    #添加联合唯一约束
alter table me drop key uk_phone;                             #删除联合唯一约束

默认约束(DEFAULT)

默认约束为列(字段)添加默认值,添加数据为空时使用默认值

在创建表时添加默认约束

使用方法直接在字段后面添加默认约束

name varchar(20) default '周八',

修改表结构时添加默认约束

使用格式:alter table <表名> modify <字段名> <数据类型> default ‘默认值’;
注意第二种方法中字段名(列名)编写两次

alter table me modify name varchar(20) default '周八';
alter table me change column name name varchar(20) default '周八';

删除默认约束

删除默认约束时和添加一样,修改表结构不加default就可以

alter table me modify name varchar(20);
alter table me change column name name varchar(20) default null;

主键约束(PRIMARY KEY)

主键约束使其值能唯一地标识表中的每一行,主键约束的列里的数据不能相同,不能为空,一般配合自增使用
每个表中只能有一个主键,多个字段(列)的复合主键为一个主键

在创建表时添加主键约束

使用方法直接在字段后面添加主键约束

name varchar(20) primary key,

修改表结构时添加主键约束

使用格式:alter table <表名> modify <字段名> <数据类型> primary key ;
以下为三种方法,第三种方式中的pk_name为主键约束名

alter table me modify name varchar(20) primary key;
alter teble me add primary key(name);
alter table me add constraint pk_name primary key(name);

删除主键约束

alter table me drop primary key;

复合主键约束

复合主键约束指一个表中一个以上的字段(列)组成的主键,复合主键约束就要使用到了表级约束
以下添加name,phone的复合主键约束,表示name和phone组合起来的一个主键
通俗易懂的了解就是一个表中班级和姓名是一个复合主键,有个姓名出现在两个班级里,由于一个班级的人比较多而产生相同的主键班级,但相同姓名不是一个班级这就是复合主键,如果同一个班级出现两个相同的名字就违背的主键的唯一性原则

primary key(name,phone)                                         #创建表时添加复合主键约束,在列定义后添加  
alter table me add constraint pk_phone primary key(name,phone);   #修改表时添加复合主键约束
alter table me drop primary key;                                    #删除复合主键约束
alter table me drop primary key,add primary key(name);          #删除复合主键中的单个方法为删除接添加,语句简练。

复合主键与联合主键

此为其余知识点
参考文章复合主键与联合主键,本人的理解复合主键就是单表多字段,联合主键就是多表多字段,但个人觉得联合主键的多表并没有太大的意义和用途

外键约束(FOREIGN KEY)

外键约束用来在两个表的数据之间建立链接,外键约束可以有一列或者多列,一个表可以有一个或多个外键
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值
外键对应的是另一个表的主键,定义外键后不可以删除另一个表中关联的行
两个关联的表中,存在主键的表为主表,存在外键的表为从表

在上面的例子上在添加一个mee表使用表级约束添加外键me_id,最后一行的fk_mee_me为外键约束名,同时将me表的id字段添加主键约束

create table mee(
id int primary key,
me_id int,
score varchar(20) comment '成绩',
number varchar(20) comment '学号',
constraint fk_mee_me foreign key(me_id) references me(id)
);

在修改表时添加外键约束

alter table mee add constraint fk_mee_me foreign key(me_id) references me(id);

删除主键约束

alter table mee drop foreign key fk_mee_me;

以上均为本人笔记,如有错误请指正,谢谢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章