【MySQL】MySQL的约束
在开始之前,笔者介绍一下笔者使用的数据库版本为5.7。所有的关系型数据库都支持对数据表使用约束,通过约束可以更好的保证数据表里数据的完整性。约束是在表上强制执行的数据校验,约束主要用于保证数据库里数据的完整性。除此之外,当表中的数据存在相互依赖性时,可以保护相关的数据不被删除。
大部分数据库支持如下5种完整性约束。
- Not Null:非空约束
- UNIQUE:唯一约束
- PRIMARY KEY:主键
- FOREIGN KEY:外键
- CHECK:检查
虽然大部分数据库都支持上面5种约束,但MySQL不支持CHECK约束,虽然MySQL的SQL语句也可以使用CHECK约束,但这个约束不会有任何作用。大部分约束都可以采用列级约束或者表级约束语法。
在MySQL的information_schema数据库里的table_constraints表来保存该数据库实例中所有的约束信息,用户可以通过查询table_constraints表来获取该数据库的约束信息。
1.NOT NULL 约束
非空约束用于确保指定列不允许为空,非空约束是比较特殊的约束,它只能作为列级约束来使用,只能使用列级约束语法来定义。这里要介绍一下SQL中的null值,SQL中的null值不区分大小写。
create table hehe(
#建立了非空约束,这意味着hehe_id不能为null
hehe_id int not null,
#MySQL的非空约束不可以指定名字
hehe_name varchar(255) not null default 'xyz',
#下面列可以为空,默认为空
hehe_gender varchar(2) null
);
除此之外,也可以在使用alter table修改表时增加和删除非空约束,SQL命令如下:
#增加非空约束
alter table hehe
modify hehe_gender varchar(2) not null
#取消非空约束
alter table hehe
modify hehe_name varchar(2) null
#取消非空约束,并且指定默认值
alter table hehe
modify hehe_name varchar(225) default 'abc' null
2.UNIQUE 约束
唯一约束用于保证指定列或指定列组合不允许为出现重复值。虽然唯一约束的列不可以出现重复值,但可以出现多个null值(因为在数据库中null不等于null)。
同一个表内可以创建多个唯一约束,唯一约束也可以由多个列组合而成。
#建表时创建唯一约束,使用列级约束语法创建约束
create table unique_test(
#建立了非空约束,这意味着test_id不能为null
test_id int not null,
#unique就是唯一约束,使用列级约束语法自动创建唯一约束
test_name varchar(255) unique
);
如果想为多列组合建立唯一索引,或者想自行指定约束名称,则需要使用表级约束语法。表级约束的语法为:
[constraint 约束名] 约束定义
表级约束的语法格式既可以放到create table语句中,也可以放到alter table 语句中用add关键字来添加。
#建表时创建唯一约束,使用表级约束语法建立约束
create table unique_test2(
#建立了非空约束,这意味着test_id不可以为null
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
#使用表级约束建立唯一约束
unique(test_name),
#使用表级约束语法建立唯一约束,而且指定约束名
constraint test2_uk unique(test_pass)
);
上面的建表语句为test_name,test_pass分别建立了唯一索引,这意味着这两列都不能出现重复值。除此之外,还可以为这两列组合建立唯一索引。
#建表时创建唯一索引,使用表级约束语法建立索引
create table unique_test3(
#建立了非空约束,这意味着test_id不可以为null
test_id int not null,
test_name varchar(255),
test_pass varchar(255),
#使用表级约束语法建立唯一约束,指定两列组合不允许为重复
constraint test3_uk unique(test_name,test_pass)
);
也可以在修改表结构的时候使用add关键字来增加唯一索引,
#增加唯一约束
alter table unique_test3
add unique(test_name,test_pass);
还可以在修改表时,指定modify关键字
#为unique test3表的test_name列增加唯一约束
alter table unique_test3
modify test_name varchar(255) unique;
3.PRIMARY KEY 约束
主键约束相当于非空约束和唯一约束,即主键约束的即不运行出现重复值,也不运行出现null值。主键的列值用于唯一标识表中的一条记录。
每个表中最多允许有一个主键,但这个主键约束可以由多个数据列组合而成,主键是表中能唯一确定一行记录的字段或是字段组合。
注:MySQl运行在建立主键约束时为该约束命名,但这个名字没有任何作用,这是为了保持与标准的SQL的兼容性。但部分数据库都允许自行指定主键的名字,但是MySQL不管用户为主键约束命名,它总是把所有的主键约束命名为PRIMARY。
很多数据库对组件列都支持一种自增长的特性,如果某个数据列的类型是整型,而且该列作为主键列,则可指定该列为具有自增长功能。指定自增长功能通常用于逻辑主键列,该列没有任何物理意义,仅仅为了标识每一行。MySQl使用auto_increment来设置自增长。
create table primary_test4(
#建立主键列,使用自增长
test_id int auto_increment primary key,
test_name varchar(255),
test_pass varchar(255)
);
4.FOREIGN KEY 约束
外键约束主要用于保证一个或两个数据表之间的参照完整性,外键是构建一个表的两个字段或是两个表的两个字段之间的参照关系。外键确保了相关的两个字段的参照关系:子(从)表外键列的值必须在主表被参照列的值范围之内,或者为空(也可以通过非空约束来约束外键列不允许为空)。
当主表记录被从表记录参照时,主表记录不允许被删除,必需先把从表里参照该记录的所有记录都删除后,才可以删除主表的该记录。还有一种方式,删除主表记录时级联删除从表中所有参照该记录的所有记录。
从表外键参照的只能是主表主键列或者唯一键列,这样才可以保证从表记录可以准确定位到被参照的主表记录。同一个表内可以拥有多个外键。
建立外键约束时,MySQL也会该列建立索引。
外键约束通常用于定义两个实体之间的一对多,一对一的关联关系。对于一对多的关联关系,通常在多的一端增加外键列,列如老师-学生(假设一个老师对应多个学生,但每个学生只有一个老师,这是典型的一对多的关联关系)。为了建立他们之间的关联关系,可以在学生表中增加一个外键列,该列中保存此条学生记录对应老师的主键。对于一对一的关联关系,则可以选择任意一方来增加外键列,增加外键列的表被称为从表,只要为外键列增加唯一约束就可以表示一对一的关系了。对于多对多的关联关系,则需要额外增加一个连接表来记录他们之间的关联关系。
建立外键约束同样可以采用列级约束语法和表级约束语法。如果仅对单独的数据列建立外键约束,则可以使用列级约束语法即可:如果需要对多列组合创建外键约束,或者需要为外键约束指定名字,则必须采用表级约束。
#为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table{
#auto_increment:代表数据库的自动编号策略,通常用做数据表的逻辑主键
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
}
create table student_table{
#为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
#指定java_teacher 参照到 teacher_table的teacher_id列
java_teacher int references teacher_table(teacher_id)
}
值得提出,虽然MySQL支持使用列级约束语法来建立外键约束,但这种约束语法建立的外键约束不会生效,MySQL提供这种约束语法仅仅是为了和标准的SQL保持兼容。因此在MySQl要使用外键约束,应该使用表级约束。
#为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table{
#auto_increment:代表数据库的自动编号策略,通常用做数据表的逻辑主键
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
}
create table student_table{
#为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
#指定java_teacher 参照到 teacher_table的teacher_id列
java_teacher int,
foreign key(java_teacher) references teacher_table(teacher_id)
}
如果使用表级约束语法,则需要使用foreign key 来指定本表的外键列,并使用references来指定参照那个主表,以及参照到主表的那个数据列。使用表级约束语法可以为外键约束指定约束名,如果创建外键约束时没有指定约束名称,则MySQL会为该外键约束命名为table_name_ibfk_n,其中table_name是从表的表名,而n是从1开始的整数。
如果需要显式指定外键约束的名称,则应该使用constraint来指定名字。
#为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table{
#auto_increment:代表数据库的自动编号策略,通常用做数据表的逻辑主键
teacher_id int auto_increment,
teacher_name varchar(255),
primary key(teacher_id)
}
create table student_table{
#为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
#指定java_teacher 参照到 teacher_table的teacher_id列
java_teacher int,
constraint student_teacher_fk foreign key(java_teacher) references teacher_table(teacher_id)
}
如果需要建立多列组合的外键约束,则必须使用表级约束的语法
#为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table2{
teacher_name varchar(255),
teacher_pass varchar(255)
primary key(teacher_name,teacher_pass)
}
create table student_table2{
#为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
java_teacher_name varchar(255),
java_teacher_pass varchar(255),
#使用表级约束语法,建立外键约束
foreign key(java_teacher_name,java_teacher_pass) references teacher_table2(teacher_name,teacher_pass);
}
删除外键约束的语法也非常简单,在alter table后增加“drop foreign key 约束名”即可。
alter table student_table2 drop foreign key student_teacher_ibfk_1;
增加外键约束,通常使用add foreign key命令。
alter table student_table2 add foreign key(java_teacher_name,java_teacher_pass) references teacher_table2(teacher_name,teacher_pass);
值得提出的是,外加约束不仅可以参照其他表,而且还可以参照自身,这个参照自身的情况通常被称为自关联。列如,使用一个表保存某个公司的所有的员工,员工之间有部门经理和普通员工之分,部门经理和普通员工之间存在一对多的关联关系,但他们都是保存在同一个数据表里的记录,这就是典型的自关联。
#使用表级约束语法建立外约束键,参照自身
create table foreign_test(
foreign_id int auto_increment primary key,
foreign_name varchar(255),
refer_id int,
foreign key(refer_id) references foreign_test(foreign_id)
);
如果想定义删除主表记录时,从表记录也会随之删除,则需要在建立外键约束后添加on delete cascade或添加 on delete set null,第一种删除主表记录时,把参照该主表记录的从表记录全部级联删除;第二种是指定当删除主键记录时,把参照该主表记录的的外键都设为null。
#为了保证从表参照的主表存在,通常应该先建立主表
create table teacher_table3{
teacher_name varchar(255),
teacher_pass varchar(255)
primary key(teacher_name,teacher_pass)
}
create table student_table3{
#为本表建立主键约束
student_id int auto_increment primary key,
student_name varchar(255),
java_teacher_name varchar(255),
java_teacher_pass varchar(255),
#使用表级约束语法,建立外键约束
foreign key(java_teacher_name,java_teacher_pass) references teacher_table3(teacher_name,teacher_pass) on delete cascade; #也可以使用on delete set null
}
5.CHECK 约束
当前版本的MySQL支持建表时指定CHECK约束,但这个CHEKC约束不会起任何作用。建立CHECK约束的语法非常简单,只要在建表列定以后添加check(逻辑表达式)即可。
create table check_test(
emp_id int primary key auto_increment,
emp_name varchar(255),
emp_salary decimal,
check(emp_salary>0)
);
然后使用如下的命令:
insert into check_test(emp_name,emp_salary) values('jame',10);
insert into check_test(emp_name,emp_salary) values('jame',-10);
会发现这两条数据都可以成功插入。
到这里MySQL的约束就介绍完了,MySQL作为一开源、免费的的数据库系统,对有些功能的支持确实不太好。如果希望MySQL创建有CHECK约束的表或是具有跟复杂约束的表,可以借助MySQL的触发机制来实现。
【MySQL】MySQL的约束的更多相关文章
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- MySQL之外键约束
MySQL之外键约束 MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbo ...
- Mysql表的约束设计和关联关系设计
https://blog.csdn.net/u012750578/article/details/15026677 Mysql表的约束设计和关联关系设计 ======================表 ...
- mysql 外键约束及表关联
一.MYSQL中的约束 1.主键:primary key 唯一非空的特性并且可以优化查询速度 2.外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性 3.唯一:un ...
- MySql中的约束
mysql中的约束使用和oracle使用差别不大. 1.主键约束 如同人对应身份证,主键能够唯一地标识表中的一条记录,可以结合外键来定义数据表之间的关系. 主键约束要求主键列的数据唯一,并且不允许为空 ...
- mysql 外键约束示例
-- 创建测试主表. ID 是主键.CREATE TABLE test_main ( id INT, value VARCHAR(10), PRIMARY KEY(id)); -- ...
- 一、TCL事务控制语言 二、MySQL中的约束 三、多表查询(重点) 四、用户的创建和授权 五、MySQL中的索引
一.TCL事务控制语言###<1>事务的概念 事务是访问并可能更新数据库中各种数据项的执行单元. 事务是一条SQL语句,一组SQL语句,或者整个程序. 事务是恢复和并发控制的基本单位. 事 ...
- Mysql 主键约束PrimaryKey
Mysql 主键约束Primary Key 今天来简单的讲一下主键约束. 假如有一张学生信息表,里面记录了学生的学号 ,姓名,成绩等,那么,会不会有两个学号相同的学生,答案肯定是否定的,如果有的话也只 ...
- mysql外键约束总结
总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...
随机推荐
- Linux echo 显示内容颜色
Linux echo 显示内容颜色 https://www.cnblogs.com/kimbo/p/6816566.html #字体颜色:30m-37m 黑.红.绿.黄.蓝.紫.青.白 str=&qu ...
- How to center body on a page?
[提问] I'm trying to center the body element on my HTML page. Basically, in the CSS I set the body e ...
- Android 设计原则【转载+整理】
原文地址 本文内容 吸引我的眼球 简化我的生活 让我眼前一亮 在使用过大量 Android APP 后,你会发现,遵循了下面这些原则的 APP 将会有更好的用户体验. 我们知道,往往国企的那些软件,都 ...
- Mybatis源码分析之SqlSession和Excutor(二)
通过上一篇文章的分析我们,我初步了解了它是如何创建sessionFactory的(地址:Mybatis源码分析之SqlSessionFactory(一)), 今天我们分析下Mybatis如何创建Sql ...
- LintCode: Number of Islands
分析:经典连通分量问题 图: 节点:所有1的位置 边:两个相邻的1的位置有一条边 BFS/DFS (DFS使用递归,代码较短) 选一个没标记的点,然后搜索,扩展4个邻居(如果有),直到不能扩展 每一次 ...
- PHP 字符串编码的转换
原文链接:http://mangguo.org/php-string-encoding-convert-and-detect/ GBK 和 UTF-8 编码的转换是一个非常恶心的事情,比如像 PHP ...
- PHP http_build_query()方法
http_build_query (PHP 5) http_build_query -- 生成 url-encoded 之后的请求字符串描述 string http_build_query ( arr ...
- EFI/UEFI BIOS启动
全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区结构.它是可扩展固件接口标准的一部分,用来替代BIOS中的主开机纪录分区表.但因为MBR分区表不支持容量 ...
- Emmet (前身为 Zen Coding)
使用示例: 在编辑器中输入缩写代码:ul>li* ,然后按下拓展键(默认为tab),即可得到代码片段: <ul> <li></li> <li>&l ...
- 运用BufferedWriter把数据写入文件
public class WriteReadFiles { private static Logger log = LoggerFactory.getLogger(WriteReadFiles.cla ...