MySQL常见建表选项及约束
阅读目录---MySQL常见的建表选项及约束:
2、指定表选项:engine、auto_increment、comment
1、not null:非空约束
2、unique:唯一约束
3、primary key:主键约束
4、foreign key:外键
5、check:检查---enum、set
一、CREATE TABLE 选项
1、在定义列的时候,指定列选项
1)DEFAULT <literal>:定义列的默认值
当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认值,将自动得到默认值 ;如果没有,则为null。

当然,也可以在INSERT和UPDATE语句中使用DEFAULT关键字显式地给列赋默认值:

函数default(column)可以得到一个列的默认值:

2)comment:用来给列添加注释,最多255个字符,注释会保存到数据字典中。
创建带有列注释的表stu_comment

从数据字典查询注释信息

2、在CREATE TABLE语句中的表选项
1)engine:指定表使用的存储引擎
存储引擎:决定了数据如何存储以及如何访问,还有事务如何处理
MySQL允许对每个表使用不同的存储引擎,如果在create table语句中没有指定存储引擎,则使用默认的存储引擎。
mysql> show engines; #查询所有支持的存储引擎
mysql> CREATE TABLE sexes(sex char(1) NOT NULL) ENGINE = INNODB;
注意:存储引擎是个重点,后面我们详细讲解。
2)auto_increment:决定当向表中插入第一行时,自增列得到的第一个值是多少
3)comment:给表添加注释

二、CREATE TABLE 约束
作用:可以为列定义约束(constraint)
约束主要是防止非法数据进入到表中,确保数据的正确性和一致性(统称数据完整性);
约束也可以防止一个表被删除 。

注意:
1)MySQL中约束保存在information_schema.table_constraints中,可以通过该表查询约束信息;
2)进行约束定义的时间:使用create table语句、使用alter table语句。
常用的约束的类型:5种
①not null:非空约束,指定某列不为空
②unique:唯一约束,指定某列和几列组合的数据不能重复
③primary key:主键约束,指定某列的数据不能重复、唯一
④foreign key:外键,指定该列记录属于主表中的一条记录,参照另一条数据
⑤check:检查,指定一个表达式,用于检验指定数据
约束定义的语法:

注意:
1)NOT NULL约束只能在列级别定义,作用在多个列上的约束只能定义在表级别,例如复合主键约束;
2)列级别上不能定义外键约束,并且不能给约束起名字,由MySQL自动命名(NOT NULL除外);
3)表级别上定义的约束可以给约束起名字(CHECK约束除外)
1、、not null非空约束
作用:用于确保当前列的值不为空。

注意:非空约束只能出现在表对象的列上。
2、unique唯一约束
1.唯一约束是指定table的列或列组合不能重复,保证数据的唯一性,约束的列不允许有重复值;
2.唯一约束不允许出现重复的值,但是可以为多个null;
3.同一个表可以有多个唯一约束,多个列组合的约束

可见,唯一性约束的列可以有多个null值,因为null <> null
4.在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同;
5.唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

3、primary key主键约束
primary key = not null + unique
主键:用来唯一的标示表中的每一行(类型一般为整型或者字符串)
具有主键约束的列不允许有null值,并且不允许有重复值;
每个表最多只允许一个主键(可定义联合主键),主键名总是PRIMARY。

!!给主键一个新的名字,但在数据字典中,主键名还是显示primary
联合主键(用几个列进行唯一标识一行)

4、foreign key外键约束
外键约束:
参照完整性约束,保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
注意:
1)具有外键约束的列的值不能随便给,必须满足外键所引用的主键的取值;
2)一张表中可以定义多个外键;
3)外键列默认可以给null值。
按照定义,外键必须引用一个主键或者唯一键,引用的主键一般在另外一张表中,也可以是本表的主键(后者称为“自引用”)。
父子表:
外键所在的表叫做子表、从表
外键所引用的主键所在的表叫做父表、主表
注意:父子表是相对而言的,表a可以是表b的子表,但同时也可以是表c的父表
示例:创建外键约束

查询数据字典,查看外键约束的信息:
上面创建子表的时候给外键约束命名emp_deptid_fk;
如果不给外键约束命名,那么默认的名字是表名_ibfk_n, n是整数,从1开始;

此时,emp表中deptid列(外键约束)受dept主表限制

外键引用定义:
、
在定义外键约束时,通过使用on delete cascade或者on delete set null选项,可以改变外键的默认删除规则:
①ON DELETE CASCADE:级联删除。当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么连同子行一起删除(很危险!!!)
②ON DELETE SET NULL:当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么不删除,而是将子行的外键列设置为null
……

5、check约束
MySQL可以使用check约束,但check约束对数据验证没有任何作用。
Oracle中可以使用check约束,是有相应的作用的。

The CHECK clause is parsed but ignored by all storage engines。
定义数据库列时,可以使用ENUM(enumeration,枚举)和SET(集合)类型:变通的实现CHECK约束
两者的区别是:
使用ENUM,只能选一个值;
使用SET,可以选多个值;
ENUM和SET中的值都必须是字符串类型。
1、enum枚举类型

注意:
在内部存储ENUM值时,MYSQL给ENUM中的每个值一个顺序号码:第一个值的顺序号码是1,第二个值的顺序号码是2,以此类推。当排序或比较ENUM的时候,使用这些顺序号码进行。

2、set类型:因为可以列举多个值,所以在建表列约束中常被使用到。

@author:http://www.cnblogs.com/geaozhang/
MySQL常见建表选项及约束的更多相关文章
- MySQL常见建表选项以约束
一.CREATE TABLE 选项 1.在定义列的时候,指定列选项 1)DEFAULT <literal>:定义列的默认值 当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认 ...
- mysql workbench 建表时 PK,NN,UQ,BIN,UN,ZF,AI解释
mysql workbench 建表时 - PK: primary key (column is part of a pk) 主键 - NN: not null (column is nullable ...
- mysql怎样建表及mysql优化
1.符合数据库三范式 2.字段选择合适的数据类型 3.注意表之间的联系,一对多,多对多,一对一 4.拆分表,把不常用的字段单独成表. 5.建立索引,哪些字段建立索引?建立索引的原则?最左前缀原则,wh ...
- mysql数据库建表的基本规范
1.创建表的时候必须指定主键,并且主键建立后最好不要再有数据修改的需求 mysql从5.5版本开始默认使用innodb引擎,innodb表是聚簇索引表,也就是说数据通过主键聚集( 主键下存储该行的数据 ...
- Mysql 批量建表存储过程
最近项目中用到了使用存储过程批量建表的功能,记录下来: USE db_test_3; drop procedure if EXISTS `createTablesWithIndex`; create ...
- mysql中一些表选项
表选项列表 表选项就是,创建一个表的时候,对该表的整体设定,主要有如下几个: charset = 要使用的字符编码, engine = 要使用的存储引擎(也叫表类型), auto_increment ...
- Mysql的建表规范与注意事项
一. 表设计规范 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储 ...
- 50个SQL语句(MySQL版) 建表 插入数据
本学期正在学习数据库,前段时间老师让我们做一下50个经典SQL语句,当时做的比较快,有一些也是百度的,自我感觉理解的不是很透彻. 所以从本篇随笔开始,我将进行50个经典SQL语句的复盘,加深理解. 答 ...
- MYSQL数据库建表注意事项
1.库名.表名.字段名必须使用小写字母,“_”分割. 原因: MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小 ...
随机推荐
- Linux下使用mail发送邮件
邮件常常是Linux下监控报警手段之一.Linux下的mail命令可以方便,快速的完成发送邮件.下面以CentOS为例 1.安装 [root@vm8028 ~]# mail -bash: mail: ...
- C# 语法特性 - 匿名方法(C#2.0)
概述 匿名方法的本质其实就是委托. 编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量. (匿名方法可以省略参数:编译的时候会自动为这个方法按照委托签名的参数添加参数) ...
- 十四、MVC的WEB框架(Structs2)
一.Structs2中的Session 1.一个是传统的servlet包下的HttpSession,一个是Structs2中自己定义的Session Servlet下的Session获取方法:Serv ...
- 从使用角度看 ReentrantLock 和 Condition
java 语言中谈到锁,少不了比较一番 synchronized 和 ReentrantLock 的原理,本文不作分析,只是简单介绍一下 ReentrantLock 的用法,从使用中推测其内部的一些原 ...
- MongoDB,无模式文档型数据库简介
MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...
- WeRun is mini-app
WeRun is a mini-app within WeChat that allows users to monitor their daily step count. One of its mo ...
- 【Eclipse使用】在eclipse里添加源文件和Api的方法
一.源代码添加 你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击 ...
- 中国队再创佳绩,IOI2018喜获四金
第30届国际信息学奥林匹克竞赛(IOI2018)于9月1日-8日在日本筑波举行,共有来自87个国家(地区)的335名选手参赛. 中国代表队四名选手经过努力拼搏,获得金牌.其中,杨懋龙(湖南长沙市 ...
- 笨办法11提问-raw_input
源代码如下,有个改动 print "How old are you?", age = raw_input() print "How tall are you?" ...
- 【转】用深度学习做crowd density estimation
本博文主要是CVPR2016的<Single-Image Crowd Counting via Multi-Column Convolutional Neural Network>这篇文章 ...