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

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE
语句)。
(1)NOT NULL约束强制列不接受NULL 值。如果不向字段添加值,就无法插入新记录或者更新记录。
(2)UNIQUE 约束唯一标识数据库表中的每条记录。
  CREATE TABLE Persons
  (Id_P int NOT NULL,
    LastName
varchar(255) NOT NULL,
    
UNIQUE (Id_P))//创建unique
    CONSTRAINT
uc_PersonID UNIQUE (Id_P,LastName)//命名unique约束

当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束
  ALTER TABLE Persons
  ADD CONSTRAINT uc_PersonID UNIQUE
(Id_P,LastName)//创建unique
  ADD CONSTRAINT uc_PersonID UNIQUE
(Id_P,LastName)//命名unique并定义多列的约束
  DROP INDEX uc_PersonID//撤销unique约束

(4)PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
  每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY
约束。
   PRIMARY KEY
约束唯一标识数据库表中的每条记录。
   主键必须包含唯一的值。
   主键列不能包含 NULL 值。
  
每个表都应该有一个主键,并且每个表只能有一个主键。
   CREATE TABLE Persons
   (Id_P int NOT NULL,
   LastName varchar(255) NOT
NULL,
   City varchar(255),
   PRIMARY KEY (Id_P)//创建主键约束
    CONSTRAINT
uc_PersonID PRIMARY KEY (Id_P,LastName)//命名主键约束
  ALTER TABLE Persons
  ADD PRIMARY KEY (Id_P)//如果在表已存在的情况下为 "Id_P" 列创建
PRIMARY KEY 约束
  ADD CONSTRAINT pk_PersonID PRIMARY KEY
(Id_P,LastName)//命名约束,并且为多列定义  约束 
DROP PRIMARY KEY撤销约束)一旦确定为主键,则该字段不可为空也不可以重复。
(5)FOREIGN KEY 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
    
CREATE TABLE Orders
    (O_Id int
NOT NULL,
    Id_P
int,
    FOREIGN KEY
(Id_P) REFERENCES Persons(Id_P))//在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN
KEY:
  CONSTRAINT fk_PerOrders FOREIGN KEY
(Id_P)REFERENCES Persons(Id_P)//命名、多列
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束
  ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)  //创建
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders  //撤销
(6)CHECK  约束用于限制列中的值的范围。
    如果对单个列定义
CHECK 约束,那么该列只允许特定的值。
    如果对一个表定义
CHECK 约束,那么此约束会在特定的列中对值进行限制。
    CHECK
(Id_P>0)创建check约束
    CONSTRAINT
chk_Person CHECK (Id_P>0 AND City='Sandnes')重命名约束
  在表已经存在的情况下,添加约束ALTER TABLE Persons ADD CHECK
(Id_P>0)
  重命名约束ALTER TABLE Persons ADD CONSTRAINT
chk_Person CHECK (Id_P>0 AND  
City='Sandnes')
  撤销约束ALTER TABLE Persons DROP CHECK
chk_Person

(7)DEFAULT DEFAULT 约束用于向列中插入默认值。
 如果没有规定其他的值,那么会将默认值添加到所有的新记录。
   City varchar(255) DEFAULT
'Sandnes'创建约束
   如果在表已存在的情况下为 "City" 列创建
DEFAULT 约束
   ALTER TABLE Persons
   ALTER City SET DEFAULT
'SANDNES'创建
   ALTER TABLE Persons
   ALTER City DROP DEFAULT 撤销

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的约束

    转自:http://blog.csdn.net/kqygww/article/details/8882990 MySQL中约束保存在information_schema数据库的table_constr ...

  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. 收集hive优化解决方案

    hive的优化问题1.启动一次JOB尽可能多做事,尽量减少job的数量.能重用就重用,要设计好的模型.2.合理设置reduce个数,reduce个数过多,会造成大量小文件问题.3.使用hive.exe ...

  2. react中路由的跳转

    1.react-router-dom 使用react-router-dom 4.4.2 在页面中直接使用 引入 i mport { Link } from 'react-router-dom' 使用 ...

  3. Shell 命令行统计 apache 网站日志访问IP以及IP归属地

    Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...

  4. Return type declarations返回类型声明

    PHP 7.新增了返回类型声明 http://php.net/manual/en/functions.returning-values.php 在PHP 7.1中新增了返回类型声明为void,以及类型 ...

  5. Vim技能修炼教程(6) - 行编辑器

    在很久很久以前,计算机的运算能力还很弱,终端与主机的通信也不好.在没有显示器的时代,只能通过电传打字机跟主机通信.那时候只有行编辑器,编辑的时候只能在一行中进行.需要显示哪一行,就把哪一行或者哪几行打 ...

  6. python的if判断补充

    python的if判断补充 exit_flag = False # 标识符 if exit_flag == False: print('exit_flag == False') exit_flag = ...

  7. Android 编程 高德地图 (实现显示地图以及定位功能)

    本文参考文章: http://www.apkbus.com/blog-904057-63610.html 本人实现的 定位代码:(具体配置省略,可见参考文章) package com.example. ...

  8. apt-get -f install

    http://zhidao.baidu.com/link?url=tZLEfm1Ycc1pWS67-95fXU596CtwA_1l2pPfzINUTxvOCvWdf3JZsWuZNxsxn0Jv6Om ...

  9. 如何写一个LaTeX类文件,并设计你自己的简历

    2017/8/29 20:26:03 原文地址 https://www.sharelatex.com/blog/2011/03/27/how-to-write-a-latex-class-file-a ...

  10. mysql 时间转换 用EXCEL实现MySQL时间戳格式和日期格互转

    今天项目表中需要导入好几w条数据 ,但日期由两个一个是标准时间一个为时间戳,程序中搜索是根据时间戳来搜索的,所以在网上翻箱倒柜的终于找到解决之道了,利用excel转换时间戳 时间戳转成正常日期的公式: ...