博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
约束 CONSTRAINT
阅读量:4516 次
发布时间:2019-06-08

本文共 3094 字,大约阅读时间需要 10 分钟。

约束用于限制加入表中数据的类型

约束的种类:

非空约束(NOT NULL):约束列不接受NULL值,强制字段始终包含值。

唯一约束(UNIQUE):约束一列或一组列中的数据是唯一的。表中可以有多个唯一约束。

主键约束(PRIMARY KEY):约束一列或一组列中的数据是唯一的,且不能改动,一个表中只能有一个主键约束。

外键约束(FOREIGN KEY):外键是表中的一列,其值必须列在另一个表的主键中。只有InnoDB支持。

默认值约束(DEFAULT):约束向列提供默认值。

检查约束(CHECK):用于保证一列或一组列中的数据满足一组指定的条件。用于约束列中值的合法取值范围。MySQL不支持该约束。


非空约束 NOT NULL

默认情况下列值是可以接受NULL值得。

创建表示添加非空约束:在类的类型后面添加NOT NULL 

create table 表名 (列1 数据类型 not null, 列2 数据类型 not null);

修改表添加非空约束 

alter table 表名 add 列名 数据类型 not null; --alter table 表名 modify 列名 数据类型 not null;

删除非空约束 

alter table 表名 modify 列名 数据类型 null;

唯一约束 UNIQUE

唯一约束与主键约束的区别

--表中可以包含多个唯一约束但只能包含一个主键

--唯一约束列可以包含NULL值,但主键不可以

--唯一约束列可以修改或更新,但是主键不可以

--唯一约束列的值可删除后重复使用,但是主键不可以

--唯一约束列不可以用来定义外键

创建表示使用UNIQUE(列名) 指定唯一约束,有以下4方式

create table 表名(列名 数据类型,列名 数据类型 unique,);--create table 表名(列名 数据类型,列名 数据类型,unique(列名,列名));--create table 表名(列名 数据类型,列名 数据类型unique key 唯一索引名(列名,列名,...));--create table 表名(列名 数据类型,列名 数据类型,constraint 约束名 unique(列名,列名,...));

向已有表中添加唯一约束

alter table 表名 add unique key 唯一索引名(列名,列名,...)alter table 表名 add unique(列名,列名, ...)alter table 表名 add constraint 约束名 unique(列名,列名,...)

修改表中的某列为唯一索引

alter table 表名 modify 列名 数据类型 unique;

删除表中的唯一约束 

alter table 表名 drop index 唯一索引名; -- 唯一索引名可通过show create table 表名查询获得

主键约束 PRIMARY KEY

表中任意类只要满足以下条件,都可以用于主键

--任意两行的主键都不相同

--每行都具有主键值(即列中不允许NULL值)

--包含主键的列从不修改或更新

--主键值不能重用

创建表时指定主键

create table 表名(列名 数据类型,列名 数据类型,[constraint [索引名]] PRIMARY KEY(列名));--create table 表名(列名 数据类型 PRIMARY KEY,列名 数据类型);

向已有表中增加主键约束

alter table 表名 add 列名 数据类型 primary key;  -- 向表中增加一列,并且将其设为主键--alter table 表名 add primary key(列名);  --将表中已有的列变为主键--alter table 表名 add constraint [约束名] primary key(列名);  --将表中已有的列变为主键

删除主键约束

alter table 表名 drop primary key;

外键约束 FOREIGN KEY 只有InnoDB支持外键约束

在创建表示定义外键约束

create table 主表名(列名 数据类型,列名 数据类型,primary key(列名));create table 附表名(列名 数据类型,列名 数据类型,constraint [约束名] foreign key(列名) references 主表名(主表的primary key列名));

向已有表中添加外键约束

alter table 表名 add constraint [约束名] foreign key(列名) references 主表名(主表的primary key列名);

删除表中的外键约束

alter table 表名 drop foreign key 外键约束名;

默认值约束 DEFAULT

create table 表名(列名 数据类型 default 默认值,列名 数据类型);

向已有表添加默认值约束或修改默认值约束

alter table 表名 modify 列名 数据类型 [default 默认值];--alter table 表名 alter 列名 set default 默认值;

删除默认值约束

alter table 表名 alter 列名 drop default;

 检查约束 CHECK

MySQL不支持CHECK约束,解决的办法有两种:

1)如果需要设置CHECK约束的字段范围小,并且比较容易列举全部的值,可考虑将该字段的类设置为枚举类型enum()或者集合类型set()。比如性别字段、爱好字段等可以这样设置。

create table checkDemoTable(id int auto_increment,name varchar(45),sex enum('男', '女'),  -- 使用enum()限制取值范围,进行约束interest set('上网', '旅游', '美食', '健身', '电影', '阅读', '音乐'),  -- 使用set()限制取值范围,进行约束primary key(id));insert into checkDemoTable(name, sex, interest)values('lily', '女', '上网, 电影, 音乐'), ('Tom', '男', '旅游, 健身, 电影');-- 超出enum()和set()范围之外值是无法插入到表中的-- enum()和set()的区别:-- enum()每次只能选择一个成员;而set()可以选择一个或者多个成员但是不能重复选择同一个成员

2)如果需要CKECK约束的字段是连续型的,不易列举时,可采用触发器来实现CHECK的功能

create table test(id int auto_increment,num int,primary key(id));-- 使用触发器来限制插入delimiter $$create trigger triggerTest before insert on test for each rowbeginif new.num < 0 thenset new.num = 0;end if;end;$$delimeter ;

测试

 

转载于:https://www.cnblogs.com/0820LL/p/9780099.html

你可能感兴趣的文章
POJ3636Nested Dolls[DP LIS]
查看>>
HDU 1573 X问题 [中国剩余定理]
查看>>
三分法
查看>>
数据结构复习1
查看>>
APM代码学习笔记1
查看>>
[转]35岁前程序员要规划好的四件事,健康居首位
查看>>
Delphi LiveBinds组件
查看>>
pc-H5 适配方案
查看>>
简单模拟多线程Socket通信(java)
查看>>
部署和操作 Enterprise Library 加密应用程序块
查看>>
LeetCode 66. Plus One
查看>>
[HNOI2019]校园旅行
查看>>
java 内部类和静态内部类的区别
查看>>
git 常用命令
查看>>
throw er; Unhandled 'error' event Error: listen EADDRINUSE的解决方法
查看>>
2016年9月份工作知识点汇总
查看>>
NOR Flash的原理与操作
查看>>
javaweb学习总结(二十六)——jsp简单标签标签库开发(二)
查看>>
Could not open Hibernate Session for transaction, 数据库连接超时解决方法
查看>>
C# UrlEncoding
查看>>