MySQL约束

  • 基本介绍

约束用于确保数据库的数据满足特定的商业规则

在mysql中,约束包括:not null,unique,primary key,foreign key 和check 5种

1.primary key(主键)

字段名 字段类型 primary key

用于唯一地标识表行的数据,当定义主键约束之后,该列不能重复

  • 细节说明
  1. primary key不能重复而且不能为null
  2. 一张表最多只能有一个主键,但是可以是复合主键
  3. 主键的指定方式有两种
    • 直接在字段名后面指定:字段名 primary key
    • 在表定义最后写 primary key(列名)
  4. 使用desc 表名,可以看到primary key的情况
  5. 在实际开发中,每一张表往往都会设计一个主键

例子

-- 主键的使用

-- id	name 	email
CREATE TABLE t17(
id INT PRIMARY KEY, -- 表示id列是主键
`name` VARCHAR(32),
email VARCHAR(32)
);
INSERT INTO t17 VALUES(1,'jack','jack@sohu.com');
INSERT INTO t17 VALUES(2,'tom','tom@sohu.com'); -- 1. primary key不能重复而且不能为null
INSERT INTO t17 VALUES(NULL,'jack','jack@sohu.com');-- 插入失败,Column 'id' cannot be null -- 2. 一张表最多只能有一个主键,但是可以是复合主键(比如id+name)
-- 演示复合主键
CREATE TABLE t18(
id INT,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY(id,`name`) -- 这里就是复合主键
); INSERT INTO t18 VALUES(1,'tom','tom@sohu.com'); -- ok
INSERT INTO t18 VALUES(1,'jack','jack@sohu.com');-- OK
INSERT INTO t18 VALUES(1,'tom','12345@sohu.com'); -- false
SELECT * FROM t18; -- 3. 主键的指定方式有两种
-- 3.1直接在字段名后面指定:字段名 primary key
CREATE TABLE t19(
id INT PRIMARY KEY,
`name` VARCHAR(32),
email VARCHAR(32)
); -- 3.2在表定义最后写 primary key(列名)
CREATE TABLE t20(
id INT,
`name` VARCHAR(32),
email VARCHAR(32),
PRIMARY KEY(id)
); -- 4. 使用desc 表名,可以看到primary key的情况
DESC t20; -- 查看t20的情况,显示约束的情况

2.not null(非空)

如果在列上定义了not null,那么当插入数据时,必须为列提供数据

字段名 字段类型 not null

3.unique(唯一)

当定义了唯一约束后,该列值是不能重复的

字段名 字段类型 unique
  • unique细节
  1. 如果没有指定not null,则unique字段可以有多个null
  2. 一张表可以有多个unique字段
-- unique的使用

CREATE TABLE t21(
id INT UNIQUE, -- 表示id列不可重复
`name` VARCHAR(32),
email VARCHAR(32)
)
INSERT INTO t21 VALUES(1,'jack','jack@sohu.com'); -- ok
INSERT INTO t21 VALUES(1,'tom','tom@sohu.com'); -- false,Duplicate entry '1' for key 'id' -- unique细节 -- 1. 如果没有指定not null,则unique字段可以有多个null
-- 如果一个列(字段),是 unique not null 则使用效果类似 primary key
INSERT INTO t21 VALUES(NULL,'tom','tom@sohu.com');-- ok
SELECT * FROM t21; -- 2. 一张表可以有多个unique字段
CREATE TABLE t22(
id INT UNIQUE, -- 表示id列不可重复
`name` VARCHAR(32) UNIQUE, -- 表示name也不可以重复
email VARCHAR(32)
)
DESC t22;

4.foreign key(外键)

  • foreign key(外键)

用于定义主表和从表之间的关系:

外键约束要定义在从表上,主表则必须具有主键约束或是unique约束。

当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

  • 语法
foreign key(本表字段名) references 主表名(主键名或unique字段名)

例子

-- 外键演示
-- 创建 主表 my_class
CREATE TABLE my_class(
id INT PRIMARY KEY, -- 班级编号
`name` VARCHAR(32) NOT NULL DEFAULT ''
); -- 创建从表 my_stu
CREATE TABLE my_stu(
id INT PRIMARY KEY,-- 学生编号
`name` VARCHAR(32) NOT NULL DEFAULT '',
class_id INT, -- 学生所在的班级的编号
-- 下面指定外键关系
FOREIGN KEY(class_id) REFERENCES my_class(id)
); -- 测试数据
INSERT INTO my_class VALUES(100,'java'),(200,'web');
INSERT INTO my_class VALUES(300,'php');
SELECT * FROM my_class; INSERT INTO my_stu VALUES(1,'tom',100);
INSERT INTO my_stu VALUES(2,'jack',200);
INSERT INTO my_stu VALUES(3,'hsp',300);
INSERT INTO my_stu VALUES(4,'mary',400); -- 失败,因为400号班级不存在 SELECT * FROM my_stu;
  • 外键细节说明
  1. 外键指向的主表的字段,要求是primary key 或是unique
  2. 表的类型是innodb,这样的表才支持外键
  3. 外键字段的类型要和主键字段的类型一致(长度可以不同)
  4. 外键字段的值,必须在主键字段中出现过,或者为null [前提是外键字段允许为null]
  5. 一旦建立主外键的关系,数据就不能随意删除了

5.check

  • check

用于强制行数据必须满足的条件。假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在此范围,就会提示出错

提示:oracle和sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效

  • 语法
列名 类型 check(check条件)

在mysql中实现check的功能,一般是在程序中控制或者通过触发器完成

例子

-- 演示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<2000)
);

6.练习

商店售货系统表设计案例

现有一个商店的数据库shop_db,记录客户及其购物情况,由下面三个表组成:

  • 商品表 goods

    • 商品号 goods_id
    • 商品名 goods_name
    • 单价 unitprice
    • 商品类别 category
    • 供应商 provider
  • 客户表 customer
    • 客户号 customer_id
    • 姓名 name
    • 住址 address
    • 电邮 email
    • 性别 sex
    • 身份证 card_Id
  • 购买表 purchase
    • 购买订单号 order_id
    • 客户号 customer_id
    • 商品号 goods_id
    • 购买数量 nums

建表,在定义中要求声明[进行合理设计]

  1. 每个表的主外键
  2. 客户的姓名不能为空值
  3. 电邮不能够重复
  4. 客户的性别[男|女]
  5. 单价unitprice在1.0~9999.99之间
-- 使用约束的课堂练习

-- 1,创建数据库
CREATE DATABASE shop_db; -- 2,商品表 goods
CREATE TABLE goods(
goods_id INT PRIMARY KEY, -- 商品号
goods_name VARCHAR(64) NOT NULL DEFAULT '', -- 商品名
unitprice DECIMAL(10,2) NOT NULL DEFAULT 0 -- 单价
CHECK(unitprice BETWEEN 1.0 AND 9999.99),
category INT NOT NULL DEFAULT 0, -- 商品类别
provider VARCHAR(64) NOT NULL DEFAULT '' -- 供应商
); -- 3,客户表 customer
CREATE TABLE customer(
customer_id CHAR(8) PRIMARY KEY, -- 客户号
`name` VARCHAR(64) NOT NULL DEFAULT '', -- 姓名
address VARCHAR(64) NOT NULL DEFAULT '', -- 地址
email VARCHAR(64) UNIQUE NOT NULL, -- 电邮
sex ENUM('男','女') NOT NULL, -- 使用枚举类型,性别
card_Id CHAR(18) -- 身份证
); -- 4,购买表 purchase
CREATE TABLE purchase(
order_id INT PRIMARY KEY, -- 订单号
customer_id CHAR(8) NOT NULL DEFAULT '', -- 客户号
goods_id INT NOT NULL DEFAULT 0, -- 商品号
num INT NOT NULL DEFAULT 0, -- 购买数量
FOREIGN KEY(customer_id) REFERENCES customer(customer_id),
FOREIGN KEY(goods_id) REFERENCES goods(goods_id)
); DESC goods;
DESC customer;
DESC purchase;



7.自增长

  • 语法
字段名 整型 primary key auto_increment

例子:在某张表中,存在一个id列(整数)

我们希望在添加记录的时候,该列从1开始自动地增长,应该怎么处理?

-- 自增长演示
-- 创建表
CREATE TABLE t24(
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32) NOT NULL DEFAULT '',
`name` VARCHAR(32) NOT NULL DEFAULT ''
); DESC t24;
-- 测试自增长的使用 INSERT INTO t24 VALUES(NULL,'jack@qq.com','jack');
INSERT INTO t24 VALUES(NULL,'tom@qq.com','tom');
INSERT INTO t24(email,`name`) VALUES('hsp@qq.com','hsp');
SELECT * FROM t24;


  • 自增长使用细节
  1. 一般来说自增长是和primary key配合使用的

  2. 自增长也可以单独使用 [但是需要配合一个unique]

  3. 自增长修饰的字段为整数型(虽然小数也可以但是很少这样使用)

  4. 自增长默认从1开始,也可以通过如下命令来修改

    alter table 表名 auto_increment = xxx;
  5. 如果添加数据时候,给自增长字段(列)指定有值,则以指定的值为准。一旦指定了值,下一次自增长就会以指定的值开始增长。因此,如果指定了自增长,一般来说就按自增长的规则来添加数据

-- 修改默认的自增长开始值
CREATE TABLE t25(
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(32) NOT NULL DEFAULT '',
`name` VARCHAR(32) NOT NULL DEFAULT ''
);
ALTER TABLE t25 AUTO_INCREMENT =100;
INSERT INTO t25 VALUES(NULL,'jack@qq.com','jack');
-- 指定值
INSERT INTO t25 VALUES(666,'hsp@qq.com','hsp');
-- 一旦指定了值,下一次自增长就会以指定的值开始增长
INSERT INTO t25 VALUES(NULL,'marry@qq.com','marry');
SELECT * FROM t25;

day07-1MySQL约束的更多相关文章

  1. mysql 外键约束

    外键的定义语法:[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)    REFERENCES tbl_name (index_col ...

  2. Day07 jdk5.0新特性&Junit&反射

    day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装M ...

  3. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  4. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  5. ASP.NET Core的路由[5]:内联路由约束的检验

    当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...

  6. SQL 约束

    先用设计器创建约束.再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制见文件Employee.sql非空约束(选择复选框)主键约束(PK) primary key const ...

  7. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  8. 如果你发现mysql的外键约束不管用了

    不知为何我机子上的mysql竟然默认关闭外键约束,导致我试了好多遍都可以插入非法值,以下语句可以开启约束 SET foreign_key_checks = 1; (0则关闭) 备忘

  9. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

  10. Mysql增加、删除和修改列属性和约束,和一些有用的查询语句

    最近在整理关于MySql的东西,把一些需要记录的东西写下来,以便以后查询和浏览,以下是一些操作技巧.添加表字段alter table` 表名称` add transactor varchar(10) ...

随机推荐

  1. 小知识:grep过滤以#号开头的注释行 和 空行

    xtts的配置文件,有很多注释不想直接去掉的情况下,想清楚的看到目前设置了哪些参数,可以用grep过滤查看: grep -vE '^#|^$' xtt.properties 效果如下: [oracle ...

  2. MAC使用XQuartz调用图形界面

    DBA经常遇到需要调用图形的操作,通常Windows用户习惯使用Xmanager这类软件,MAC用户习惯使用XQuartz,之前版本系统会自带,现在需要自行下载. 比如在 https://www.xq ...

  3. 使用OBS Studio软件进行桌面录屏

    操作系统 :Windows10_x64 OBS Studio是开源免费的录屏和直播软件,支持Windows.macOS及Linux操作系统. 这里记录下桌面录屏和桌面区域录屏的使用,也方便我后续查阅( ...

  4. drawio画图软件使用入门

    drawio是一个画图软件,擅长处理流程图,可以替换visio用来画流程图,也可以编辑visio文件. 体验地址:https://app.diagrams.net/ 截图如下: 可以直接使用在线版本, ...

  5. JS axios cancelToken 是如何实现取消请求?稍有啰嗦但超有耐心的 axios 源码分析

    壹 ❀ 引 axios,一个基于promise且对ajax进行了二次封装的http库,在提供了与promise类似的API便捷写法同时,它还有一大特点,便是支持取消http请求.当然取消请求并不是ax ...

  6. 提高Java开发生产力,我选Stream API,真香啊

    Java 8 引入的Stream API提供了一种新的数据处理方式,它以声明式.函数式的编程模型,极大地简化了对集合.数组或其他支持数据源的操作.Stream可以被看作是一系列元素的流水线.允许你高效 ...

  7. NC16742 [NOIP2002]字串变换

    题目链接 题目 题目描述 已知有两个字串 A, B及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在A中的子串 A1可以变换为 B1.A2可以变换 ...

  8. Python def() 后的-> 符号的作用

    python – 定义函数 def 后面的 ->,:表示的含义-> 常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数返回的类型. : 表示参数的类型建议符示例: de ...

  9. SATA学习笔记——Link Layer 加扰/解扰/CRC

    一.故事前传 我们之前说到Link layer的结构,link layer的作用大致可以包括以下几点: Frame flow control CRC的生成与检测 对数据与控制字符的Scrmable/D ...

  10. Centos7安装MySQL5.7和Redis6.0流水账

    安装mysql 使用rpm包安装 yum remove mariadb-libs.x86_64 yum install perl rpm -ivh mysql-community-common-5.7 ...