• 约束是添加在列上, 用来约束列的!

1. 主键约束(表中的某行的唯一标识)

  1. 主键的特点:

    • 非空
    • 唯一
    • 被引用
  2. 创建表时, 指定主键的两种方式:
// 需求: 指定 sid 列为主键列, 即为 sid 列添加主键约束
// 第一种方式:
CREATE TABLE stu(
sid CHAR(6) PRIMARY KEY,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
); // 第二种方式:
CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(20),
age INT,
gender VARCHAR(10),
PRIMARY KEY(sid)
);
  1. 修改表时,指定主键: ALTER TABLE stu ADD PRIMARY KEY(sid);
  2. 删除主键: ALTER TABLE stu DROP PRIMARY KEY;

2. 主键自增长

  1. 因为主键列的特性是: 必须唯一, 不能为空, 所以我们通常会指定主键类型为整型, 然后设置其自动增长,

    这样可以保证在插入数据时, 主键列的唯一和非空特性.
  2. 创建表时,指定主键自增长
    CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
age INT,
gender VARCHAR(10)
);
  1. 修改表时, 设置主键自增长: ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
  2. 修改表时, 删除主键自增长: ALTER TABLE stu CHANGE sid sid INT;

3. 非空约束

  1. 因为某些列不能设置为 NULL 值, 所以可以对列添加非空约束.
// 示例: 对 sname 列设置非空约束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
age INT,
gender VARCHAR(20)
);

4. 唯一约束

  1. 数据库某些值不能设置重复的值, 所以可以对列添加唯一约束.
    // 示例: 对 sname 列设置唯一约束
CREATE TABLE stu(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) UNIQUE,
age INT,
gender VARCHAR(20)
);

5. 概念模型

当我们要完成一个软件体统时, 需要把系统中的实体抽取出来, 形成概念模型.

例如部门, 员工都是系统中的实体. 概念模型中的实体最终都会称为 JAVA 中的 domain类(对象模型), 数据库中的表(关系模型).

5.1 实体之间的关系有三种:

  • 1 对多: 例如每个员工都从属一个部门, 而一个部门可以有多个员工, 其中员工是多方, 而部门是一方;
  • 1 对 1 : 例如老公和老婆就是一对一的关系.(不常见)
  • 多对多 : 老师和学生的关系就是多对多, 一个老师可以有多个学生, 一个学生可以有多个老师.

5.2 对象模型和关系模型

  1. 对象模型(Java 中的类): 可以双向关联, 而且引用的是对象, 而不是一个主键!
  2. 关系模型(数据库中的表): 只能多方引用一方, 而且引用的只是主键, 而不是一整行记录.
  3. java 中的类,使用成员变量来完成关系, 一般都是双向关联!!
// 实体之间的关系, java 代码体现
// 多对一关系:
class Employee{ // 多方关联一方, 即员工关联部门
...
private Department department;
} class Department{ // 一方关联多方, 即部门关联员工
...
private List<Employee> employee;
} // 多对多
class Student{ // 学生关联老师
...
private List<Teacher> teacher;
} class Teacher{
...
private List<Student> student;
}

6. 外键约束

  1. 外键特点:

    • 外键必须是另一张表的主键的值(即外键要引用主键)
    • 外键可以重复
    • 外键可以为空
    • 一张表中可以有多个外键!!
  2. 创建表时, 指定外键约束:
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT,
CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)
) // fk_emp_dept : 约束名称
// fk, 表示 foreign key;
// emp, 表示从表, 即多方;
// dept, 表示主表, 即一方
// dno: 表示本表中作为外键的列
// dept(deptno): 表示引用的是 dept表的 deptno列
  1. 修改表时, 添加外键约束:

    ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno);
  2. 修改表时, 删除外键约束:

    ALTER TABLE emp DROP FOREIGN KEY fk_emp_deptno;

7. 数据库中一对一关系

// 在表中建立一对一关系比较特殊, 需要让从表的主键, 也是外键.
CREATE TABLE husband(
hid INT PRIMARY KEY,
...
); CREATE TABLE wife(
wid INT PRIMARY KEY,
...
CONSTRAINT fk_wife_hid FOREIGN KEY(wid) REFERENCES husband(hid)
); /*
* 其中, wife 表的 wid 键既是主键,又是相对 husband 表的外键!
* husband.hid 是主键, 不能重复!
* wife.wid 是主键,不能重复, 又是外键, 必须来自 husband.hid.
* 所以如果 wife 表中有一条记录的 wid 为 1, 那么 wife 表中的其他记录的 wid 就不能再是1了,因为它是主键.
* 同时, 在 husband.hid 中必须存在 1 这个值, 因为 wid 是外键, 这就完成了一对一关系.
*/

8. 数据库中多对多关系

  1. 在表中建立多对多关系需要使用中间表, 即需要三张表, 在中间表中使用两个外键, 分别引用其他两个表的主键.
CREATE TABLE student( // 学生表
sid INT PRIMARY KEY,
...
); CREATE TABLE teacher( // 教师表
tid INT PRIMARY KEY,
...
); CREATE TABLE stu_tea(
sid INT,
tid INT,
CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
); // 这时, 在 stu_tea 这个中间表中的每条记录都是说明 student 和 teacher 表的关系.
// 例如, stu_tea 表中的记录: sid 为100, tid 为 201, 说明编号为 100 的学生有一个编号为 201 的老师.

参考资料:

MySQL 的约束的更多相关文章

  1. MYSQL中约束及修改数据表

    MYSQL中约束及修改数据表 28:约束约束保证数据的完整性和一致性约束分为表级约束和列级约束约束类型包括:    NOT NULL(非空约束)    PRIMARY KEY(主键约束)    UNI ...

  2. 【MySQL】MySQL的约束

    在开始之前,笔者介绍一下笔者使用的数据库版本为5.7.所有的关系型数据库都支持对数据表使用约束,通过约束可以更好的保证数据表里数据的完整性.约束是在表上强制执行的数据校验,约束主要用于保证数据库里数据 ...

  3. mysql的约束

    SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). (1)NOT NULL约 ...

  4. [转]mysql的约束

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

  5. MYSQL数据库约束类型

    07.14自我总结 MYSQL数据库约束类型 一.主键约束(primary key) 主键约束要求主键列的数据唯一,并且不能为空.主键分为两种类型:单字段主键和多字段联合主键. 1.单字段主键 写法 ...

  6. MySQL学习——约束

    MySQL学习——约束 摘要:本文主要学习了数据库的约束. primary key(主键) 定义 主键约束是一个列或者多个列,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可以强制 ...

  7. Mysql五大约束

    Mysql五大约束 约束:对表中数据的限制.保证表中数据的准确和可靠 (1)NOT NULL:非空,用于保证该字段的值不能为空 (2)DEFAULT:默认,用于保证该字段有默认值(3)PRIMARY ...

  8. mysql DEFAULT约束 语法

    mysql DEFAULT约束 语法 作用:用于向列中插入默认值. 说明:如果没有规定其他的值,那么会将默认值添加到所有的新记录.直线电机 mysql DEFAULT约束 示例 //在 "P ...

  9. mysql CHECK约束 语法

    mysql CHECK约束 语法 作用:CHECK 约束用于限制列中的值的范围. 直线电机 说明:如果对单个列定义 CHECK 约束,那么该列只允许特定的值.如果对一个表定义 CHECK 约束,那么此 ...

  10. mysql UNIQUE约束 语法

    mysql UNIQUE约束 语法 作用:UNIQUE 约束唯一标识数据库表中的每条记录. 江苏大理石平台 说明:UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证.PRI ...

随机推荐

  1. 如何查看mysql数据库的引擎/MySQL数据库引擎详解

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...

  2. (三)Oracle学习笔记—— sql语句

    0. scott 用户默认表介绍 scott用户Tables目录下包含四张表 1. insert(插入)语句 给指定列插入数据: ,'xx'); 插入全部列数据: ,'xx','lll'); 2. u ...

  3. table行编辑

    一个简单的Demo <html> <head> <title>Table Test Demo</title> <style> .view_t ...

  4. Dapper用法小记

    https://github.com/StackExchange/Dapper dapper in 查询 string sql = "SELECT * FROM SomeTable WHER ...

  5. Nginx HttpSubModule sub_filter模块的过滤功能

    Nginx HttpSubModule sub_filter模块的过滤功能 发表于2年前(2013-08-05 10:39)   阅读(1481) | 评论(0) 0人收藏此文章, 我要收藏 赞0 5 ...

  6. archive的时候报“ no identity found&quot;错误 解决方式

    第一步: 在xcode----target----general----identity----team里 增加你们公司的账号就能够了 第二步: Xcode > Preferences > ...

  7. 解决pip安装模块报错Cannot fetch index base URL http://pypi.python.org/simple/

    产生这个问题的原因呢和github一样,因为他们用的cdn被墙.经小伙伴反馈,解决办法如下. 通过指定国内镜像源来安装: pip --trusted-host 镜像源 install 模块名 -i 镜 ...

  8. Unity3D学习笔记——初级知识

    一:Unity欢迎窗口对于初学者来说有很多有价值的信息,值得用户关注,以下将简要介绍这个窗口中的相关内容: 1.Video Tutorials: 提供unity相关的教程 ,包括用户手册 .组件手册以 ...

  9. SlidingMenu官方实例分析8——CustomAnimation

    CustomAnimation 构造方法: 其中CanvasTransformer对象是重点,因为他是实现动画的对象,设置对象的代码如下: 其中变化方法如下: 其中的canvas.scale(),方法 ...

  10. ROS导航之地图costmap_2d与bresenham算法

    读者可以参读http://wiki.ros.org/costmap_2d   costmap_2d: 无论是激光雷达还是如kinect 或xtion pro深度相机作为传感器跑出的2D或3D SLAM ...