MySQL——约束(constraint)详细解释

  • 约束是什么用来干嘛?
    约束实际上就是表中数据的限制条件
    作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
    比如一些字段的唯一性,将一些字段约束成外键
  • 约束种类:
    非空约束(not null)
    唯一性约束(unique)
    主键约束(primary key) PK
    外键约束(foreign key) FK
    检查约束(目前MySQL不支持、Oracle支持)
  • A、非空约束
    用not null约束的字段不能为null值,必须给定具体的数据
    创建表,给字段添加非空约束(创建用户表,用户名不能为空)

    create table blog (
    id int(12) not null;
    )
    insert插入数据时如果插入id为null直接报错

    B、唯一性约束
    unique约束的字段,具有唯一性,不可重复,但可以为null
    创建表,保证邮箱地址唯一(列级约束)
    create table blog (
    id int(12) not null UNIQUE;
    )
    表级约束
    create table blog (
    id int(12) not null;
    UNIQUE(id);
    )
    如果插入相同 id 会报错
    使用表级约束,给多个字段联合约束
    联合约束,表示两个或以上的字段同时与另一条记录相等,则报错
    create table blog (
    id int(12) not null;
    name varchar(20) not null;
    unique(id,name);
    )
    如果与联合字段都相同,则报错
    表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
    create table blog (
    id int(12) not null;
    name varchar(20) not null;
    CONSTRAINT t_id_name unique(id,name);
    )
    constraint是约束关键字,t_user_email_unique自己取的名字

    C、主键约束(primary key)PK
    表设计时一定要有主键
    主键约束
    主键字段
    主键值
    表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
    主键约束与“not null unique”区别:给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和”not null unique”约束相同,但是本质不同。
    主键约束除了可以做到”not null unique”之外,还会默认添加”索引——index”
    一张表应该有主键字段,如果没有,表示该表无效
    主键值:是当前行数据的唯一标识、是当前行数据的身份
    即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
    按主键约束的字段数量分类:无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
    单一主键:给一个字段添加主键约束
    复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
    1)单一主键(列级定义)
    mysql> create table t_user(
    -> id int(10) primary key,
    -> name varchar(30)
    -> );
    Query OK, 0 rows affected (0.07 sec)
    2)单一主键(表级定义)
    mysql> create table t_user(
    -> id int(10),
    -> name varchar(30) not null,
    -> constraint t_user_id_pk primary key(id)
    -> );
    Query OK, 0 rows affected (0.01 sec)
    3)复合主键(表级定义)
    mysql> create table t_user(
    -> id int(10),
    -> name varchar(30) not null,
    -> email varchar(128) unique,
    -> primary key(id,name)
    -> );
    Query OK, 0 rows affected (0.05 sec)

    在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)
    mysql> create table t_user(
    -> id int(10) primary key auto_increment,
    -> name varchar(30) not null
    -> );
    Query OK, 0 rows affected (0.03 sec)
    插入两行记录,id主键值会自动增加
    mysql> insert into t_user(name) values(‘jay‘);
    Query OK, 1 row affected (0.04 sec)

    mysql> insert into t_user(name) values(‘man‘);
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from t_user;
    +----+------+
    | id | name |
    +----+------+
    | 1 | jay |
    | 2 | man |
    +----+------+
    2 rows in set (0.00 sec)

    D、外键约束(foreign key)FK
    只能是表级定义
    foreign key(classno) references t_class(cno)
    外键约束主要用来维护两个表之间数据的一致性
    外键约束
    外键字段
    外键值

    外键约束、外键字段、外键值之间的关系:某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

    按外键约束的字段数量分类:a、单一外键:给一个字段添加外键约束
    b、复合外键:给多个字段联合添加一个外键约束

    一张表可以有多个外键字段(与主键不同)

    栗子:存储学生班级 信k 息
    mysql> drop table if exists t_student;
    mysql> drop table if exists t_class;

    mysql> create table t_class(
    -> cno int(10) primary key,
    -> cname varchar(128) not null unique
    -> );

    mysql> create table t_student(
    -> sno int(10) primary key auto_increment,
    -> sname varchar(30) not null,
    -> classno int(3),
    -> foreign key(classno) references t_class(cno)
    -> );

    mysql> insert into t_class(cno,cname) values(100,‘aaaaaaxxxxxx‘);
    mysql> insert into t_class(cno,cname) values(200,‘oooooopppppp‘);
    mysql> insert into t_student(sname,classno) values(‘jack‘,100);
    mysql> insert into t_student(sname,classno) values(‘lucy‘,100);
    mysql> insert into t_student(sname,classno) values(‘king‘,200);
    班级表t_class:
    mysql> select from t_class;
    +-----+--------------+
    | cno | cname |
    +-----+--------------+
    | 100 | aaaaaaxxxxxx |
    | 200 | oooooopppppp |
    +-----+--------------+
    学生表t_student:
    mysql> select
    from t_student;
    +-----+-------+---------+
    | sno | sname | classno |
    +-----+-------+---------+
    | 1 | jack | 100 |
    | 2 | lucy | 100 |
    | 3 | king | 200 |
    +-----+-------+---------+
    上表中找出每个学生的班级名称:
    mysql> select s.,c. from t_student s join t_class c on s.classno=c.cno;
    +-----+-------+---------+-----+--------------+
    | sno | sname | classno | cno | cname |
    +-----+-------+---------+-----+--------------+
    | 1 | jack | 100 | 100 | aaaaaaxxxxxx |
    | 2 | lucy | 100 | 100 | aaaaaaxxxxxx |
    | 3 | king | 200 | 200 | oooooopppppp |
    +-----+-------+---------+-----+--------------+
    这就是数据实体的一对多关系模型:在多的那一方加外键来约束

    原文地址:https://blog.51cto.com/11585002/2445240

    时间: 2025-01-05 12:55:15

    MySQL——约束(constraint)详细解释的相关文章

    mysql常用配置---详细解释

    mysql配置(部分常用的参数) [mysqld] socket = /tmp/mysql.sock # 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件) port             = 3306 # 指定MsSQL侦听的端口 skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间.但需要注意,如果开启该选项, 则所有远程主机连接

    MySQL TIMESTAMP(时间戳)详细解释

    当你创建一个表假设表中有类型的字段TIMESTAMP,该字段默认情况下,语句生成: CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=gbk 假设有两个字段类型为TIMESTAMP,则生成语句为: CREATE TABLE `

    mysql status 详细解释

    状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务器而失败的连接数 Binlog_cache_disk_use Global 使用临时二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量 Binlog_cache_use Global 使用临时二进制日志缓存的事务数量 Bytes_received Bo

    Mysql错误编码和解释表

    Mysql错误编码和解释表1.错误消息的组成 一共由三部分组成 mysql数字错误代码,这个数字的mysql的特定值,不可以移植到其它数据库系统. 一个五位长度的sqlstate值,这些值取自ANSI SQL和ODBC,并且更加标准化.并不是所有的MySQL错误号都具有相应的SQLSTATE值.在这些情况下,使用'HY000' (一般错误). 错误的消息描述 2.一些额外的说明 如果需要错误检查,请使用错误代码,而不是错误消息. 如果数据库管理员更改语言设置,则会影响错误消息的语言. 错误代码在

    cmd批处理转义字符%的详细解释

    cmd批处理转义字符%的详细解释 在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同. 1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸字符等.也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”.而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%. 2.for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行

    SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释 2016-04-14 23:40 13030人阅读 评论(2) 收藏 举报 分类: SSM(7) 这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算对其中的XML配置文件有了一定的了解,所以拿出来一起分享一下,希望有不足的地方大家批评指正~~~ 首先   这篇文章暂时只对框架中所要用到的配置文件进行解

    (转载)SQL基础--> 约束(CONSTRAINT)

    感谢Leshami的分享,原文地址:http://blog.csdn.net/leshami/article/details/5711367 --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完整性 实体完整性:表中记录不重复(任何两条记录不全等)并且每条记录都有一个非空主键 域完整性:表中字段值必须与字段数据类型.格式.有效范围相吻合 参照完整性:不能引

    Android中多线程编程(四)AsyncTask类的详细解释(附源码)

    Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

    我对CONTAINING_RECORD宏的详细解释

    宏CONTAINING_RECORD的用处其实还是相当大的, 而且很是方便, 它的主要作用是: 根据结构体中的某成员的指针来推算出该结构体的指针! 下面从一个简单的例子开始说起: 我们定义一个结构体, 同时类型化: typedef struct{ int a; int b; int c; }ss; 这是一个很简单的结构体, 没什么特殊的, 稍微分析下该结构体: 结构体的大小(字节):4+4+4=12字节 成员a的偏移:0 成员b的偏移:4 成员c的偏移:8 我们用ss来定义一个变量: ss s