day07-1MySQL约束

打印 上一主题 下一主题

主题 996|帖子 996|积分 2988

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
MySQL约束


  • 基本介绍
约束用于确保数据库的数据满足特定的商业规则
在mysql中,约束包括:not null,unique,primary key,foreign key 和check 5种
1.primary key(主键)
  1. 字段名 字段类型 primary key
复制代码
用于唯一地标识表行的数据,当定义主键约束之后,该列不能重复

  • 细节说明

  • primary key不能重复而且不能为null
  • 一张表最多只能有一个主键,但是可以是复合主键
  • 主键的指定方式有两种

    • 直接在字段名后面指定:字段名 primary key
    • 在表定义最后写 primary key(列名)

  • 使用desc 表名,可以看到primary key的情况
  • 在实际开发中,每一张表往往都会设计一个主键
例子
  1. -- 主键的使用
  2. -- id        name         email
  3. CREATE TABLE t17(
  4.         id INT PRIMARY KEY, -- 表示id列是主键
  5.         `name` VARCHAR(32),
  6.         email VARCHAR(32)
  7. );
  8. INSERT INTO t17 VALUES(1,'jack','jack@sohu.com');
  9. INSERT INTO t17 VALUES(2,'tom','tom@sohu.com');
  10. -- 1. primary key不能重复而且不能为null
  11. INSERT INTO t17 VALUES(NULL,'jack','jack@sohu.com');-- 插入失败,Column 'id' cannot be null
  12. -- 2. 一张表最多只能有一个主键,但是可以是复合主键(比如id+name)
  13. -- 演示复合主键
  14. CREATE TABLE t18(
  15.         id INT,
  16.         `name` VARCHAR(32),
  17.         email VARCHAR(32),
  18.         PRIMARY KEY(id,`name`) -- 这里就是复合主键
  19. );
  20. INSERT INTO t18 VALUES(1,'tom','tom@sohu.com'); -- ok
  21. INSERT INTO t18 VALUES(1,'jack','jack@sohu.com');-- OK
  22. INSERT INTO t18 VALUES(1,'tom','12345@sohu.com'); -- false
  23. SELECT * FROM t18;
  24. -- 3. 主键的指定方式有两种
  25. --  3.1直接在字段名后面指定:字段名 primary key
  26. CREATE TABLE t19(
  27.         id INT PRIMARY KEY,
  28.         `name` VARCHAR(32),
  29.         email VARCHAR(32)
  30. );
  31. --  3.2在表定义最后写 primary key(列名)
  32. CREATE TABLE t20(
  33.         id INT,
  34.         `name` VARCHAR(32),
  35.         email VARCHAR(32),
  36.         PRIMARY KEY(id)
  37. );
  38. -- 4. 使用desc 表名,可以看到primary key的情况
  39. DESC t20; -- 查看t20的情况,显示约束的情况
复制代码
2.not null(非空)

如果在列上定义了not null,那么当插入数据时,必须为列提供数据
  1. 字段名 字段类型 not null
复制代码
3.unique(唯一)

当定义了唯一约束后,该列值是不能重复的
  1. 字段名 字段类型 unique
复制代码

  • unique细节

  • 如果没有指定not null,则unique字段可以有多个null
  • 一张表可以有多个unique字段
  1. -- unique的使用
  2. CREATE TABLE t21(
  3.         id INT UNIQUE, -- 表示id列不可重复
  4.         `name` VARCHAR(32),
  5.         email VARCHAR(32)
  6. )
  7. INSERT INTO t21 VALUES(1,'jack','jack@sohu.com'); -- ok
  8. INSERT INTO t21 VALUES(1,'tom','tom@sohu.com');  -- false,Duplicate entry '1' for key 'id'
  9. -- unique细节
  10. -- 1. 如果没有指定not null,则unique字段可以有多个null
  11. -- 如果一个列(字段),是 unique not null 则使用效果类似 primary key
  12. INSERT INTO t21 VALUES(NULL,'tom','tom@sohu.com');-- ok
  13. SELECT * FROM t21;
  14. -- 2. 一张表可以有多个unique字段
  15. CREATE TABLE t22(
  16.         id INT UNIQUE, -- 表示id列不可重复
  17.         `name` VARCHAR(32) UNIQUE, -- 表示name也不可以重复
  18.         email VARCHAR(32)
  19. )
  20. DESC t22;
复制代码
4.foreign key(外键)


  • foreign key(外键)
用于定义主表和从表之间的关系:
外键约束要定义在从表上,主表则必须具有主键约束或是unique约束。
当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

  • 语法
  1. foreign key(本表字段名) references 主表名(主键名或unique字段名)
复制代码
例子
  1. -- 外键演示
  2. -- 创建 主表 my_class
  3. CREATE TABLE my_class(
  4.         id INT PRIMARY KEY, -- 班级编号
  5.         `name` VARCHAR(32) NOT NULL DEFAULT ''
  6. );
  7. -- 创建从表 my_stu
  8. CREATE TABLE my_stu(
  9.         id INT PRIMARY KEY,-- 学生编号
  10.         `name` VARCHAR(32) NOT NULL DEFAULT '',
  11.         class_id INT, -- 学生所在的班级的编号
  12.         -- 下面指定外键关系
  13.         FOREIGN KEY(class_id) REFERENCES my_class(id)
  14. );
  15. -- 测试数据
  16. INSERT INTO my_class VALUES(100,'java'),(200,'web');
  17. INSERT INTO my_class VALUES(300,'php');
  18. SELECT * FROM my_class;
  19. INSERT INTO my_stu VALUES(1,'tom',100);
  20. INSERT INTO my_stu VALUES(2,'jack',200);
  21. INSERT INTO my_stu VALUES(3,'hsp',300);
  22. INSERT INTO my_stu VALUES(4,'mary',400); -- 失败,因为400号班级不存在
  23. SELECT * FROM my_stu;
复制代码

  • 外键细节说明

  • 外键指向的主表的字段,要求是primary key 或是unique
  • 表的类型是innodb,这样的表才支持外键
  • 外键字段的类型要和主键字段的类型一致(长度可以不同)
  • 外键字段的值,必须在主键字段中出现过,或者为null  [前提是外键字段允许为null]
  • 一旦建立主外键的关系,数据就不能随意删除了
5.check


  • check
用于强制行数据必须满足的条件。假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在此范围,就会提示出错
提示:oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效

  • 语法
  1. 列名 类型 check(check条件)
复制代码
在mysql中实现check的功能,一般是在程序中控制或者通过触发器完成
例子
[code]-- 演示check的使用-- 目前mysql5.7还不支持check,只做语法校验但不会生效-- 测试CREATE TABLE t23(        id INT PRIMARY KEY,        `name` VARCHAR(32),        sex VARCHAR(6) CHECK(sex IN('man','woman')),        sal DOUBLE CHECK(sal >1000 AND sal
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表