转自:http://blog.csdn.net/kqygww/article/details/8882990

MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息;

约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除。

常用五类约束:
not null:非空约束,指定某列不为空 
unique: 唯一约束,指定某列和几列组合的数据不能重复 
primary key:主键约束,指定某列的数据不能重复、唯一 
foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据 
check:检查,指定一个表达式,用于检验指定数据 
注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果;   
根据约束数据列限制,约束可分为:
单列约束:每个约束只约束一列 
多列约束:每个约束约束多列数据

1、not null

非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。 
Null类型特征: 所有的类型的值都可以是null,包括int、float等数据类型 空字符串””是不等于null,0也不等于null 
create table temp(         
id int not null,         
name varchar(255) not null default ‘abc’,         
sex char null 
)
上面的table加上了非空约束,也可以用alter来修改或增加非空约束 
增加非空约束 
alter table temp modify sex varchar(2) not null;   
取消非空约束 
alter table temp modify sex varchar(2) null;   
取消非空约束,增加默认值 
alter table temp modify sex varchar(2) default ‘abc’;

2、unique

唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。 MySQL会给唯一约束的列上默认创建一个唯一索引;
create table temp (         
id int not null,         
name varchar(25),         
password varchar(16), 
constraint uk_name_pwd unique(name, password) 
); 
表示用户名和密码组合不能重复 
添加唯一约束 
alter table temp add unique(name, password); 
修改唯一性约束
alter table temp modify name varchar(25) unique; 
删除约束 
alter table temp drop index name;

3、primary key

主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。 
列模式: 
create table temp(     
id int primary key,     
name varchar(25) 
);   
create table temp2(     
id int not null,     
name varchar(25),     
pwd varchar(15),     
constraint pk_temp_id primary key(id) 
);   
组合模式: 
create table temp2(     
id int not null,     
name varchar(25),     
pwd varchar(15),     
constraint pk_temp_id primary key(name, pwd) 
);
alter删除主键约束 
alter table temp drop primary key;   
alter添加主键 
alter table temp add primary key(name, pwd);   
alter修改列为主键 
alter table temp modify id int primary key;   
设置主键自增 
create table temp(         
id int auto_increment primary key,         
name varchar(20),         
pwd varchar(16) 
); 
auto_increment自增模式,设置自增后在插入数据的时候就不需要给该列插入值了。

4、foreign key

外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。 也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据。还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列,假定引用的主表列不是唯一的记录, 那么从表引用的数据就不确定记录的位置。同一个表可以有多个外键约束。
创建外键约束: 
主表 
create table classes(         
id int auto_increment primary key,         
name varchar(20) 
); 
从表 
create table student(         
id int auto_increment,         
name varchar(22),         
constraint pk_id primary key(id),         
classes_id int references classes(id) 
);   
通常先建主表,然后再建从表,这样从表的参照引用的表才存在。
表级别创建外键约束: 
create table student(         
id int auto_increment primary key,         
name varchar(25),                        
classes_id int,         
foreign key(classes_id) references classes(id) 
); 
上面的创建外键的方法没有指定约束名称,系统会默认给外键约束分配外键约束名称,命名为student_ibfk_n, 其中student是表名,n是当前约束从1开始的整数。  
指定约束名称: 
create table student(         
id int auto_increment primary key,         
name varchar(25),         
classes_id int,                
constraint fk_classes_id foreign key(classes_id) references classes(id) 
);   
多列外键组合,必须用表级别约束语法: 
create table classes(         
id int,         
name varchar(20),         
number int,         
primary key(name, number) 
); 
create table student(         
id int auto_increment primary key,         
name varchar(20),         
classes_name varchar(20),         
classes_number int,                
foreign key(classes_name, classes_number) references classes(name, number) 
);   
删除外键约束: 
alter table student drop foreign key student_ibfk_1; 
alter table student drop foreign key fk_student_id;   
增加外键约束:
alter table student add foreign key(classes_name, classes_number) references classes(name, number);  
自引用、自关联(递归表、树状表) 
create table tree(         
id int auto_increment primary key,         
name varchar(50),         
parent_id int,         
foreign key(parent_id) references tree(id) 
);   
级联删除:删除主表的数据时,关联的从表数据也删除,则需要在建立外键约束的后面增加on delete cascade 或on delete set null,前者是级联删除,后者是将从表的关联列的值设置为null。
create table student(         
id int auto_increment primary key,         
name varchar(20),         
classes_name varchar(20),         
classes_number int,         /*表级别联合外键*/         
foreign key(classes_name, classes_number) references classes(name, number) on delete cascade
);

5、check

MySQL可以使用check约束,但check约束对数据验证没有任何作用。 
create table temp(         
id int auto_increment,         
name varchar(20),         
age int,         
primary key(id), 
check(age > 20) 
); 
上面check约束要求age必须大于20,但没有任何作用。但是创建table的时候没有任何错误或警告。

[转]mysql的约束的更多相关文章

  1. MYSQL中约束及修改数据表

    MYSQL中约束及修改数据表 28:约束约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括:    NOT NULL(非空约束)    PRIMARY KEY(主键约束)    UNI ...

  2. 【MySQL】MySQL的约束

    在开始之前,笔者介绍一下笔者使用的数据库版本为5.7.所有的关系型数据库都支持对数据表使用约束,通过约束可以更好的保证数据表里数据的完整性.约束是在表上强制执行的数据校验,约束主要用于保证数据库里数据 ...

  3. mysql的约束

    SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). (1)NOT NULL约 ...

  4. MYSQL数据库约束类型

    07.14自我总结 MYSQL数据库约束类型 一.主键约束(primary key) 主键约束要求主键列的数据唯一,并且不能为空.主键分为两种类型:单字段主键和多字段联合主键. 1.单字段主键 写法 ...

  5. MySQL学习——约束

    MySQL学习——约束 摘要:本文主要学习了数据库的约束. primary key(主键) 定义 主键约束是一个列或者多个列,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可以强制 ...

  6. Mysql五大约束

    Mysql五大约束 约束:对表中数据的限制.保证表中数据的准确和可靠 (1)NOT NULL:非空,用于保证该字段的值不能为空 (2)DEFAULT:默认,用于保证该字段有默认值(3)PRIMARY ...

  7. mysql DEFAULT约束 语法

    mysql DEFAULT约束 语法 作用:用于向列中插入默认值. 说明:如果没有规定其他的值,那么会将默认值添加到所有的新记录.直线电机 mysql DEFAULT约束 示例 //在 "P ...

  8. mysql CHECK约束 语法

    mysql CHECK约束 语法 作用:CHECK 约束用于限制列中的值的范围. 直线电机 说明:如果对单个列定义 CHECK 约束,那么该列只允许特定的值.如果对一个表定义 CHECK 约束,那么此 ...

  9. mysql UNIQUE约束 语法

    mysql UNIQUE约束 语法 作用:UNIQUE 约束唯一标识数据库表中的每条记录. 江苏大理石平台 说明:UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证.PRI ...

随机推荐

  1. hdu 1166敌兵布阵(线段树入门题)

    >>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...

  2. 2.5.5 基本的 I/0 重定向

        标准输入/输出(standard I/O)可能是软件设计原则里最重要的概念了.这个概念就是:程序应该有数据的来源端.数据的目的端以及报告问题的地方,它们分别被称为标准输入(standard i ...

  3. Java中list集合ArrayList 中contains包含的使用

    Java中list集合ArrayList 中contains包含的使用 https://blog.csdn.net/qq_38556611/article/details/78774690

  4. T1462 素数和 codevs

    题目描述 Description 给定2个整数a,b 求出它们之间(不含a,b)所有质数的和. 输入描述 Input Description 一行,a b(0<=a,b<=65536) 输 ...

  5. css3 transform对其他样式影响,(尤其是position:flixed)

    1.transform 会为当前元素添加 position : relative 特性: 当 magin 为负值的时候,就会覆盖到前面的 元素, 然而如果给前面元素添加了transform 属性后,前 ...

  6. vsftpd conf 解釋

    Linux中vsFTP位置约定:/usr/sbin/vsftpd ---- VSFTPD的主程序/etc/rc.d/init.d/vsftpd ---- 启动脚本/etc/vsftpd/vsftpd. ...

  7. hadoop-2.6.0 Unhealthy Nodes 问题

    近期安装hadoop-2.6.0集群时,打开8088页面,查看集群信息,看到集群出现Unhealthy Nodes 的问题,点击该处.会展开Unhealthy Nodes 的情况,这时会看到Healt ...

  8. Android自己定义控件系列案例【五】

    案例效果: 案例分析: 在开发银行相关client的时候或者开发在线支付相关client的时候常常要求用户绑定银行卡,当中银行卡号一般须要空格分隔显示.最常见的就是每4位数以空格进行分隔.以方便用户实 ...

  9. Python3基础(十) 类的初印象

    Python是一种面向对象的脚本语言,所以它也提供了面向对象编程的所有基本特征:允许多继承的类继承机制.派生类可以重写它父类的任何方法.一个方法可以调用父类中同名的方法.对象可以包含任意数量和类型的数 ...

  10. inline-block元素因基线对齐而造成上浮的问题

    假设我需要实现将三个块级元素并排对齐的如下效果: 代码如下: <!DOCTYPE html> <html lang="en-US"> <head> ...