什么是字段约束

  • 字段约束就是将字段的内容定一个规则,我们要按照规则办事
约束 描述 关键字
非空约束 限制该字段的数据不能为null not null
唯一约束 保证该字段的所有数据都是唯一、不重复的 unlque
默认约束 保存数据时,如果未指定该字段的值,则采用默认值 default
主键约束 主键是一行数据的唯一标识,要求非空且唯一 primary key
外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 forelgn key

分类

字段名 字段含义 字段类型 约束条件 约束关键字
id ID唯一标识 int 主键,并且自动增长 primary key,auto_increment
name 姓名 varchar(10) 不能空,并且唯一 not null, unlque
age 年龄 int 大于0,并且小于等于120 check
status 状态 char(1) 如果没有指定该值,默认为1 default
gender 性别 char(1)

无符号、零填充

unsigned无符号

mysql> create table t17(
-> id int unsigned
-> );
Query OK, 0 rows affected (0.19 sec)

插入数字是不能带符号

zerofill使用0填充

mysql> create table t18(
-> id int zerofill
-> );
Query OK, 0 rows affected (0.22 sec)

零填充会自动使用无符号位;零填充指的是位数固定,如果数值长度不足字段类型的长度,则使用0来填充

非空

用not null约束的字段不能为null值,必须给定具体的数据

<字段名><数据类型> NOT NULL

举例:

create table t1(
id int,
name varchar(16)
);
insert into t1(id) values(1);
insert into t1(name) values('jason');
inser into t1(name,id) values('kevin',2);

create table t2(
id int,
name varchar(16) not null
);
insert into t2(id) values(1);
insert into t2(name) values('jason');
insert into t2 values(1,'');
insert into t2 values(2,null);

没有插入name字段数据,则会报错

默认值

简介

默认值(Default)的完整称呼是“默认值约束(Default Constraint)”,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值

默认值约束

<字段名> <数据类型> DEFAULT <默认值>;
'''一般情况下配合非空一起使用'''

举例:

create table t3(
id int default 666,
name varchar(16) default '匿名'
);
insert into t3(id) values(1);
insert into t3(name) values('jason');
insert into t3values(2, 'kevin');

唯一值(键)

单列唯一

<字段名><数据类型> unique
create table t4(
id int unique,
name varchar(32) unique
);
insert into t4 values(1, 'jason'),(2, 'jason');

联合唯一

create table t5(
id int,
ip varchar(32),
port int,
unique(ip,port)
);
insert into t5 values(1,'127.0.0.1',8080),(2,'127.0.0.1',8081),(3,'127.0.0.2',8080);
insert into t5 values(4,'127.0.0.1',8080);

主建

情况1:

单从约束层面上而言主键相当于not null + unique(非空且唯一)

<字段名> <数据类型> PRIMARY KEY [默认值]
create table t6(
id int primary key,
name varchar(32)
);
insert into t6(name) values('jason');
insert into t6 values(1,'kevin');
insert into t6 values(1, 'jerry');

情况2:

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
  • InnoDB存储引擎规定了所有的表都必须有且只有一个主键(主键是组织设计的重要条件并且主键且主键可以加快数据的查询速度)

1.当表中没有主键也没有其他非空切唯一的字段的情况下

InnoDB会采用一个隐藏的字段作为表的主键 隐藏意味着无法使用 基于该表的数据查询只能一行行查找 速度很慢

2.当表中没有主键但是有其他非空且唯一的字段 那么会从上往下将第一个该字段自动升级为主键

create table t7(
id int,
age int not null unique,
phone bigint not null unique,
birth int not null unique,
height int not null unique
);

  • 我们在创建表的时候应该有一个字段用来标识数据的唯一性 并且该字段通常情况下就是'id'(编号)字段
create table userinfo(
uid int primary key,
);
'''必须要写的代码'''

自增

该约束条件不能单独出现 并且一张表中只能出现一次 主要就是配合主键一起用

create table t8(
id int primary key,
name varchar(32)
); create table t9(
id int primary key auto_increment,
name varchar(32)
);

自增特性

  • 自增不会因为数据的删除而回退 永远自增往前

    如果自己设置了更大的数 则以后按照更大的往前自增

外键前戏

MySQL外键的作用:

  • 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值
我们需要一张员工表
id name age dep_name dep_desc 1.表语义不明确(到底是员工还是部门) 无所谓
2.存取数据过于冗余(浪费存储空间) 无所谓
3.数据的扩展性极差 不能忽略 将上述表一分为二
id name age id dep_name dep_desc
上述的三个问题全部解决 但是员工跟部门之间没有了关系

关系的判断

表关系、数据关系其实意思是一样的 知识说法上有区分

关系总共有四种

一对多

多对多

一对一

没有关系

关系的判断可以采用'换位思考'原则

一对多

以员工表和部门表为例
1.先站在员工表的角度
问:一名员工能否对应多个部门
答:不可以
2.再站在部门表的角度
问:一个部门能否对应多名员工
答:可以
结论:一个可以一个不可以 那么关系就是'一对多'
针对'一对多'关系 外键字段建在'多'的一方

外键字段的建立

  • 小技巧:先定义出含有普通字段的表 之后再考虑外键字段的添加
create table emp(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
); create table dep(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);
  1. 创建表的时候一定要先创建被关联表
  2. 录入表数据的时候一定要先录入被关联表
  3. 修改数据的时候外键字段无法修改和删除

针对3有简化措施>>>:级联更新级联删除

create table emp1(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade
on delete cascade
); create table dep1(
id int primary key auto_increment,
dep_name varchar(32),
dep_desc varchar(64)
);

总结:外键其实是强耦合 不符合解耦合的特性

所以很多时候 实际项目中当表较多的情况 我们可能不会使

用外键 而是使用代码建立逻辑层面的关系

多对多关系

以书籍表与作者表为例

1.先站在书籍表的角度

问:一本书能否对应多个作者

答:可以

2.再站在作者表的角度

问:一个作者能否对应多本书

答:可以

结论:两个都可以 关系就是'多对多'

针对'多对多'不能在表中直接创建 需要新建第三张关系表

create table book(
id int primary key auto_increment,
title varchar(32),
price float(5,2)
);
create table author(
id int primary key auto_increment,
name varchar(32),
phone bigint
);
create table book2author(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);

一对一

以用户表与用户详情表为例

1.先站在用户表的角度

问:一个用户能否对应多个用户详情

答:不可以

2.再站在用户详情表角度

问:一个用户详情能否对应多个用户

答:不可以

  • 结论:两个都可以 关系就是'一对一'或者没有关系

    针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中

create table user(
id int primary key auto_increment,
name varchar(32),
detail_id int unique,
foreign key(detail_id) references userdetail(id)
on update cascade
on delete cascade
); create table userdetail(
id int primary key auto_increment,
phone bigint
);

和一对多差不多,加一个唯一条件

mysql数据库(字段约束条件)的更多相关文章

  1. Flask与mysql数据库字段类型的区别以及基本用法

    Mysql里面的int在Flask中里面使用Integer Mysql里面的varcahar在Flask中里面使用String 与Mysql数据库需要导入模块 #导入第三方链接库sql点金术 from ...

  2. mysql数据库字段bigint使用

    Mysql里有个数据类型bigint 在java转换成实体对象时,处理不当容易出现以下异常: java.lang.ClassCastException: java.lang.Long cannot b ...

  3. MySQL 数据库字段类型使用说明

    简介 MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型. 数值类型 下列用于描述的代码字母中: M表示最大的显示尺寸.最大的合法的显示尺寸是 255 .(注 ...

  4. MYSQL数据库字段命名及设计规范

    1.设计原则 1) 标准化和规范化数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡. ...

  5. sqlalchemy字段与mysql数据库字段对应问题

    字段类型是在定义模型时, 对每个 Column 的类型约定. 不同类型的字段类型在输入输出上, 及支持的操作方面, 有所区别. 这里只介绍 sqlalchemy.types.* 中的类型, SQL 标 ...

  6. mysql数据库字段类型的选择原则

    原文链接:http://blog.csdn.net/u013412790/article/details/51615407 数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销 ...

  7. MySQL数据库 字段操作 多表关系(更新中...)

    外键 (foreign key) ## 外键 ```mysql # 作者(author):id,name,sex,age,mobile, detail_id # 作者详情(author_detail) ...

  8. flask下直接展示mysql数据库 字段

    在工作中,会导出一份mysql的html来查看,用的是就是路过秋天大神的那个工具,所以想自己用那个样式直接在后端写一个页面做展示! 前端页面 from flask import Flask,reque ...

  9. MySql数据库字段排序规则不一致产生的一个问题

    最近项目向MySql迁移,迁移完毕后,在获取用户权限时产生了一个异常,跟踪进去获取执行的语句如下, SELECT PermissionId FROM spysxtPermission WHERE (R ...

  10. mysql数据库字段内容替换

    UPDATE 表名 SET 字段名= replace(字段名, '查找内容', '替换成内容') ; UPDATE car_articles SET article_title = replace(a ...

随机推荐

  1. SonarQube 的安装、配置及 Maven 项目的使用

    转载自:https://cloud.tencent.com/developer/article/1010612 1.SonarQube 介绍 SonarQube 是一个用于管理源代码质量开放平台,它可 ...

  2. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(24)-Fiddler如何优雅地在正式和测试环境之间来回切换-中篇

    1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考. 2.实际工作场景 2.1问题场景 (1)已发布 ...

  3. 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事(SR寄存器BP[x:0]位)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事. 痞子衡最近在支持一个 i.MXRT1170 欧 ...

  4. 自定义View6 -塔防小游戏:第三篇防御塔随意放置+多组野怪

    第一篇:一个防御塔+多个野怪(简易版)第二篇:防御塔随意放置第三篇:防御塔随意放置+多组野怪 1.动态addView防御塔 2.防御塔放置后不可以移动 3.弯曲道路 4.素材替换 第四篇:多波野怪 第 ...

  5. CSS基础-关于CSS注释的添加

    在 CSS 中增加注释很简单,所有被放在/*和*/分隔符之间的文本信息都被称为注释. CSS 只有一种注释,不管是多行注释还是单行注释,都必须以/*开始.以*/结束,中间加入注释内容. 1.注释放在样 ...

  6. 洛谷P1962 斐波那契数列 (矩阵快速幂)

    学了矩阵,练一下手... 1 #include<bits/stdc++.h> 2 typedef long long ll; 3 const ll mod=1e9+7; 4 using n ...

  7. logback.xml详解

    介绍 之前博文有专门介绍过基于Log4j Appender 实现大数据平台组件日志的采集, 本篇主要对java项目中经常会接触到的logback.xml文件的配置做一个介绍和总结. logback.x ...

  8. 腾讯云短信SDK-精简版

    /** * 腾讯云短信SDK-精简版 * 本模块使用-向腾讯云短信服务器发送请求 * @return json 腾讯服务器返回值-json字符串 */ private function send_sm ...

  9. 后端框架的学习----mybatis框架(3、配置解析)

    3.配置解析 1.核心配置文件 2.环境配置(environment) 3.属性(properties) 可以通过properties属性来实现引用配置文件 这些属性可以在外部进行配置,并可以进行动态 ...

  10. 后端框架的学习----mybatis框架(6、日志)

    六.日志 如果一个数据库操作,出现了异常,我们需要排错,日志就是最好的帮手 setting设置 <settings> <setting name="logImpl" ...