一. 介绍

  约束条件与数据类型的宽度一样,都是可选参数

  作用:用于保证数据的完整性和一致性
  主要分为:

  1. PRIMARY KEY 标示该字段为表的主键,可以唯一的标示记录
  2. FOREIGN KEY 标示该字段为该表的外键
  3. NOT NULL 标示该字段不能为空
  4. UNIQUE KEY 标示该字段的值是唯一的
  5. AUTO_INCREMENT 标示该字段是自增长类型(数据类型为整数且是主键)
  6. DEFAULT 为对应的字段设置默认值
  7.  
  8. UNSIGNED 无符号
  9. ZEROFILL 使用0填充

使用方法及说明

  

  1. #创建一个班级,班级的id是主键且是自增长类型的,班级的名称不能为空
  2.  
  3. create table class(
  4. id int(4) primary key auto_increment ,
  5. name char(20) not null
  6. );
  7. insert into class (name) values("中学三年二班"); #插入一条记录
  8. # 创建一个学生表,id为主键,自增长,姓名不能为空,性别默认男,班级编号不能为空,班级编号的外键是class表中的id,分数是无符号类型.(0-255)
  9.  
  10. create table student(
  11. id int primary key auto_increment,
  12. name char(6) not null,
  13. sex enum("男","女") default "男",
  14. class_id int(6) not null,
  15. foreign key(class_id) references class(id),
  16. score int(3) unsigned
  17. );
  18.  
  19. insert into student (name,sex,class_id,score)values("jack","男",1,75);
    外键语法:
    foreign key(要引用外键的字段) references 被引用的表名(被引用的表字段);
    注意:
      如果一个字段未设置not null,插入数据的时候,如果不给该字段传值,则默认值为NULL,如果设NOT NULL,则该字段不能为空,否则报错

二. not null 和default

  

是否可空,null表示空,非字符串
not null - 不可空
null - 可空

default默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

create table tb1(id int not null defalut  2 ,num int not null)

三. unique唯一性约束

  单列唯一,设置某一个字段的唯一性.

  1. -----1.单列唯一---------
  2. create table t2(
  3. id int not null unique,
  4. name char(10)
  5. );
  6. insert into t2 values(1,'jack');
  7. insert into t2 values(1,'lucy');
  8. #上面创建表的时候把id设置了唯一约束。那么在插入id=1,就会出错了

  联合唯一,设置多个字段组成在一起是唯一的.

  1. create table t20(id int not null unique auto_increment,host char(15),port int,unique(host,port)); #设置host和port字段联合唯一
  2.  
  3. insert into t23(host,port) values("172.16.0.253",1990);
  4. insert into t23(host,port) values("172.16.0.253",1991);
  5. insert into t23(host,port) values("172.16.0.252",1990);
  6.  
  7. # 2个字段合在一起是唯一的.

四. primary key(主键约束)

  primary key字段的值不为空且唯一,一张表中可以做单列主键和复合主键(多列主键),但是一张表中只能有一个主键.

  1. create table t25(id int primary key auto_increment,name char(6),age int);
  2. insert into t25(name,age) values("jack",18);
  3. select * from t25;
  4. +----+------+------+
  5. | id | name | age |
  6. +----+------+------+
  7. | 1 | jack | 18 |
  8. +----+------+------+
  9.  
  10. #id作为自增长的主键

单列主键

  1. create table t24(
  2. name char(10) not null,
  3. host char(15),
  4. port int,
  5. primary key(host,port)
  6. );
  7. insert into t24 values("mysql","172.168.0.253",3306);
  8. insert into t24 values("ftp","172.168.0.253",21);
  9. insert into t24 values("mysql","172.168.0.253",3306); #插入相同的会报错
  10. #用法和unique的联合唯一差不多

多列主键

五. auto_increment(自增长约束)

  auto_increment有2个属性:

  1.auto_increment_increment  步长

  2.auto_increment_offset 起始偏移量

  1. ---------------------未设置步长和起始偏移量------------------------------
  2. create table t26(id int primary key auto_increment,name char(6));
  3. insert into t26(name) values("IT"),("HR"),("SALER");
  4. SELECT * FROM T26;
  5. +----+-------+
  6. | id | name |
  7. +----+-------+
  8. | 1 | IT |
  9. | 2 | HR |
  10. | 3 | SALER |
  11. +----+-------+
  12.  
  13. --------------------------设置起始步长为100---------------------------------------
  14. create table t27(id int primary key auto_increment,name char(6))auto_increment=100;
  15. insert into t27(name) values("IT"),("HR"),("SALER");
  16. SELECT * FROM T27;
  17. +-----+-------+
  18. | id | name |
  19. +-----+-------+
  20. | 100 | IT |
  21. | 101 | HR |
  22. | 102 | SALER |
  23. +-----+-------+
  24. ------------------------------设置步长和起始偏移量------------------------------------
  25. set session auto_increment_increment =1000;
  26. 还是在27这张表插入一个新的值
  27. insert into t27 (name) values("HHH"); #HHH的编号已经是1001了
  28. select * from t27;
  29. +------+-------+
  30. | id | name |
  31. +------+-------+
  32. | 100 | IT |
  33. | 101 | HR |
  34. | 102 | SALER |
  35. | 1001 | HHH |
  36. +------+-------+
  37.  
  38. #设置偏移量
  39. set session auto_increment_offset =2;
  40. insert into t27(name) values ("RRR"),("PPP"),("QQQ");
  41. select * from t27;
  42. +------+-------+
  43. | id | name |
  44. +------+-------+
  45. | 100 | IT |
  46. | 101 | HR |
  47. | 102 | SALER |
  48. | 1001 | HHH |
  49. | 2002 | RRR |
  50. | 3002 | PPP |
  51. | 4002 | QQQ |
  52. +------+-------+
  53.  
  54. #每增加一个值,步长都会增加1000,偏移量是2

注意:offset的值不能大于increment的值,否则无效.

六. 外键约束(foreign key)

  员工表里有三个字段:姓名,性别,部门.现在公司有员工20000人,3个部门.这意味着部门名称会有大量的重复数据.这时候可以使用外键来解决这个问题.先建立一个部门表.再建立员工表,把员工表中的部门ID设置为外键,来自部门表中的部门ID即可.

开始建表,注意:一定要先建立被关联的外键表(部门表).在建立(员工表),被关联的字段必须是唯一的,要先给被关联的表插入记录.

  1. create table dep(id int primary key auto_increment,name char(15));
  2. insert into dep(name) values("HR"),("IT"),("SALE");
  3. mysql> SELECT * FROM DEP;
  4. +----+------+
  5. | id | name |
  6. +----+------+
  7. | 1 | HR |
  8. | 2 | IT |
  9. | 3 | SALE |
  10. +----+------+
  11. create table emp(id int primary key auto_increment,name char(6) not null,
  12. sex enum("male","female"),depart_id int);
  13.  
  14. insert into emp(name,sex,depart_id) values
  15. ("jack","male",2),
  16. ("lucy","female",1),
  17. ("lili","female",3),
  18. ("hanmeimei","female",1),
  19. ("lilei","male",2),
  20. ("erya","female",3);
  21.  
  22. select * from emp;
  23. +----+--------+--------+-----------+
  24. | id | name | sex | depart_id |
  25. +----+--------+--------+-----------+
  26. | 1 | jack | male | 2 |
  27. | 2 | lucy | female | 1 |
  28. | 3 | lili | female | 3 |
  29. | 4 | hanmei | female | 1 |
  30. | 5 | lilei | male | 2 |
  31. | 6 | erya | female | 3 |
  32. +----+--------+--------+-----------+
  33.  
  34. show create table emp\G;
  35. *************************** 1. row ***************************
  36. Table: emp
  37. Create Table: CREATE TABLE `emp` (
  38. `id` int(11) NOT NULL AUTO_INCREMENT,
  39. `name` char(6) NOT NULL,
  40. `sex` enum('male','female') DEFAULT NULL,
  41. `depart_id` int(11) DEFAULT NULL,
  42. PRIMARY KEY (`id`),
  43. KEY `depart_id` (`depart_id`),
  44. CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`depart_id`) REFERENCES `dep` (`id`)
  45. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
  46. 1 row in set (0.00 sec)

外键约束(foreign key

上面建立的表,有一个坏处,如果部门的id发生了变化,员工表中的部门id并不会有所改变.如果部门解散了.员工信息也不会删除.

  1. drop table emp;
  2. create table emp(id int primary key auto_increment,
  3. name char(6) not null,
  4. sex enum("male","female"),
  5. depart_id int,foreign key (depart_id) references dep(id)
  6. on delete cascade
  7. on update cascade); #加上这两个语句,在部门ID发生变化时,员工表中的部门id也会跟着辩护
  8. update table dep id=101 where id=1; #修改部门1的id
  9. select * from emp;
  10.  
  11. +----+--------+--------+-----------+
  12. | id | name | sex | depart_id |
  13. +----+--------+--------+-----------+
  14. | 1 | jack | male | 2 |
  15. | 2 | lucy | female | 101 |
  16. | 3 | lili | female | 3 |
  17. | 4 | hanmei | female | 101 |
  18. | 5 | lilei | male | 2 |
  19. | 6 | erya | female | 3 |
  20. +----+--------+--------+-----------+

外键约束优化版

day 7-14 数据库完整性约束的更多相关文章

  1. Python标准库14 数据库 (sqlite3)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...

  2. 【循序渐进学Python】14.数据库的支持

    纯文本只能够实现一些简单有限的功能.如果想要实现自动序列化,也可以使用 shelve 模块和 pickle 模块来实现.但是,如果想要自动的实现数据并发访问,以及更标准,更通用的数据库(databas ...

  3. MySQL数据库----完整性约束

    一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...

  4. 08-Mysql数据库----完整性约束

    总结:      1,not null 不能插入空,不设置可空       2,unique  单列唯一 create table department(name char(10) unique); ...

  5. 数据库及SQL----常用知识点总结

    数据库也是计算机类笔试面试中不可避免会遇到的考点,尤其是银行和部分传统软件类公司.这里根据整理的资料,对数据库的相关知识也做个总结吧.希望学过数据库但长时间不用的同学根据这些知识能够回忆和重拾,没学过 ...

  6. Oracle数据库 —— DDL

    时间:2016-10-5 14:55 逆风的方向更适合飞翔我不怕千万人阻挡只怕自己投降 --------------------------------------- 一.表的创建与管理1.表的基本操 ...

  7. asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库

    1.首先下载vs2015的Asp.Net Core(RC2)的插件工具(https://www.microsoft.com/net/core#windows)2.创建一个asp.net Core的项目 ...

  8. MySql数据库的基本原理及指令

    1.什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作. 2.简介 MySQL是一个开放源 ...

  9. Python 经典面试题汇总之数据库篇

    数据库和缓存 1.列举常见的关系型数据库和非关系型都有那些? 关系型数据库(需要有表结构) mysql.oracle.splserver.postgresql.db2.sybase 非关系型数据库(是 ...

随机推荐

  1. docker常用命令(自用)

    docker container ls -f "status=exited" docker rm $(docker container ls -f "status=exi ...

  2. Linux之命令初识

    Linux与windows目录结构对比 命令mkdir.ls.ls -l.cd .pwd [root@oldboyedu-01 ~]# #创建目录 make directory mkdir [root ...

  3. [matlab] 11.多边形凹凸性检测

    clear all;close all;clc; n=20; p=rand(n,2); p=createSimplyPoly(p); %创建简单多边形 hold on; for i=1:n if i= ...

  4. [matlab] 1.拟合

    x = [1 2 3 4 5 6 7 8 9 ]; y = [9 7 6 3 -1 2 5 7 20]; p=polyfit(x,y,3); %数字代表拟合函数的阶数 xi=0:0.01:10; yi ...

  5. 实战Performance Monitor监测EnyimMemcached

    首先要将EnyimMemcached安装至Windows Performance Counters中. 将Enyim.Caching.dll复制到一个文件夹中 在命令行中进入.NET Framewor ...

  6. centos7修改系统语言为简体中文

    centos7修改系统语言为简体中文 说明 自己装系统时一般都可以自定义选择系统语言.可是云端服务器一般都是安装好的镜像,默认系统语言为英文,对于初学者可能还会有搞不懂的计算机词汇.这里简单说一下ce ...

  7. 【转】宽带路由器应用(三)—ARP欺骗防护功能的使用

    在局域网中,通信前必须通过ARP协议来完成IP地址转换为第二层物理地址(即MAC地址).ARP协议对网络安全具有重要的意义.通过伪造IP地址和MAC地址实现ARP欺骗,对网络的正常传输和安全都是一个很 ...

  8. go标准库的学习-path/filepath

    参考https://studygolang.com/pkgdoc 标准库path中有的该path/filepath库中都有,所以一般都使用path/filepath 导入方式: import &quo ...

  9. linux进程控制开发实例

    fork.c #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include < ...

  10. Ambari 使用 Hive View 异常处理

    异常:进入Hive View提示user home check fail 详细日志:Service 'userhome' check failed: java.io.FileNotFoundExcep ...