表完整性约束

2023-11-14

介绍

认识:约束条件和数据类型宽度一样,都是可选类型

作用:用于保证数据的完整性、一致性

有哪几种约束:

primary key (PK):标识该字段为该表的主键,可以唯一标识的记录
foreign key (FK):标识该字段为该表的外键
not null:标识该字段不能为空,必须赋值
unique key (UK):标识该字段的值是唯一的
auto_increment:标识该字段的值自动增长(整数类型,而且为主键)
default:为该字段设置默认值,如果插入时不给该字段设置值,此字段使用默认值。

unsigned:表示无符号
zerofill:表示使用0填充

例子:
sex enum('male','female') not null default 'male'  不允许为空,默认是male
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20

not null 和 default

是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值

mysql> create table t1(
    -> id int not null default 2, 
    -> name char(18) not null);
mysql> insert into t1 values(1,'游帅');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 游帅   |
+----+--------+
1 row in set (0.00 sec)

练习:

往表中插入数据的时候  可以指定字段进行插入 不需要全部都插
insert into table1(name,id) values('egon',2);

mysql> create table student(
    -> name varchar(10) not null,
    -> age tinyint unsigned not null,
    -> sex enum('male', 'female'),
    -> hobby set('a', 'b', 'c', 'd') default 'a,b');
Query OK, 0 rows affected (0.02 sec)
===================================================================
mysql> insert into student values('游爹',18,'male','a,c,b');
Query OK, 1 row affected (0.00 sec)
=================================================================
mysql> select * from student;
+--------+-----+------+-------+
| name   | age | sex  | hobby |
+--------+-----+------+-------+
| 游爹   |  18 | male | a,b,c |
+--------+-----+------+-------+
1 row in set (0.00 sec)

unique:唯一

单列唯一:限制某一个字段是唯一的
=====================方法1==========================
mysql> create table t1(
    -> name varchar(20) unique
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 values('游爹');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 values('游爹');
ERROR 1062 (23000): Duplicate entry '游爹' for key 'name'
mysql> select * from t1;
+--------+
| name   |
+--------+
| 游爹   |
+--------+
1 row in set (0.00 sec)
=====================方法2==========================
方法二:
create table department2(
id int,
name varchar(20),
comment varchar(100),
constraint uk_name unique(name)
);
联合唯一:在语句的最后 用括号的形式 表示哪几个字段组合的结果是唯一的
mysql> create table server(
    -> id int primary key,
    -> ip varchar(15),
    -> port tinyint, 
    -> unique(ip,port)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into server values(1,'127.0.0.1',8080);
ERROR 1264 (22003): Out of range value for column 'port' at row 1
mysql> insert into server values(1,'127.0.0.1',10);
Query OK, 1 row affected (0.01 sec)

mysql> select * from server;
+----+-----------+------+
| id | ip        | port |
+----+-----------+------+
|  1 | 127.0.0.1 |   10 |
+----+-----------+------+
1 row in set (0.00 sec)

mysql> insert into server values(2,'127.0.0.1',10);
ERROR 1062 (23000): Duplicate entry '127.0.0.1-10' for key 'ip'

primary key

限制效果跟 not null + unique 组合效果一致 非空且唯一

单列做主键
==================方法一:not null+unique
create table department1(
    id int not null unique, #主键
    name varchar(20) not null unique,
    comment varchar(100)
);

mysql> desc department1;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | NO   | UNI | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)

====================方法二:
#方法二:在某一个字段后用primary key
create table department2(
id int primary key, #主键
name varchar(20),
comment varchar(100)
);

mysql> desc department2;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | YES  |     | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.00 sec)
=====================方法三:在所有字段后单独定义primary key
create table department3(
id int,
name varchar(20),
comment varchar(100),
constraint pk_name primary key(id); #创建主键并为其命名pk_name

mysql> desc department3;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | int(11)      | NO   | PRI | NULL    |       |
| name    | varchar(20)  | YES  |     | NULL    |       |
| comment | varchar(100) | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
rows in set (0.01 sec)
多列做主键
==================多列做主键================
create table service(
ip varchar(15),
port char(5),
service_name varchar(10) not null,
primary key(ip,port)
);


mysql> desc service;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ip           | varchar(15) | NO   | PRI | NULL    |       |
| port         | char(5)     | NO   | PRI | NULL    |       |
| service_name | varchar(10) | NO   |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into service values
    -> ('172.16.45.10','3306','mysqld'),
    -> ('172.16.45.11','3306','mariadb')
    -> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into service values ('172.16.45.10','3306','nginx');
ERROR 1062 (23000): Duplicate entry '172.16.45.10-3306' for key 'PRIMARY'
primary key也是innodb引擎查询必备的索引,索引你就把当成书的目录
innodb引擎在创建表的时候 必须要有一个主键
当你没有指定主键的时候
1.会将非空且唯一的字段自动升级成主键
2.当你的表中没有任何的约束条件  innodb会采用自己的内部默认的一个主键字段
    该主键字段你在查询时候是无法使用的
    查询数据的速度就会很慢
    类似于一页一页的翻书      
    create table t19(
        id int,
        name char(16),
        age int not null unique,
        addr char(16) not null unique
    );
            
主键字段到底设置给谁呢???
    通常每张表里面都应该有一个id字段
    并且应该将id设置为表的主键字段
联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键!!!
!!!!!!!!!!!!!!!!!ps:innodb引擎中一张表有且只有一个主键!!!!!!!!!!!!!!!!!!!!!!!

auto_increment

主键字段应该具备自动递增的特点
每次添加数据  不需要用户手动输入
auto_increment  自动递增

create table t21(id int primary key auto_increment,name varchar(16));
create table t22(id int primary key,name varchar(16));
mysql> create table t1(
    -> id int auto_increment primary key,
    -> name varchar(100)
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> desc t1
    -> ;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(100) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> insert into t1 values(1, '游爹');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 游爹   |
+----+--------+
1 row in set (0.00 sec)

转载于:https://www.cnblogs.com/KbMan/p/11380741.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表完整性约束 的相关文章

  • idea :不支持发行版本11问题

    11修改为 本地安装的9
  • Sql Server数据库语言设置

    数据库 安全性 用户名属性 默认语言选择对应语言即可
  • 三剑客

    https blog csdn net liushengxi root article details 72810319
  • 数学建模算法汇总(全网最全,含matlab案例代码)

    数学建模常用的算法分类 全国大学生数学建模竞赛中 常见的算法模型有以下30种 最小二乘法 数值分析方法 图论算法 线性规划 整数规划 动态规划 贪心算法 分支定界法 蒙特卡洛方法 随机游走算法 遗传算法 粒子群算法 神经网络算法 人工智能算
  • Twitter账号优化:吸引更多关注与互动

    创建Twitter账号并进行优化 优化你的 Twitter 个人数据有助于提高企业的可视性并促进与用户的互动 通过与其他社交媒体页面的相互协调 你还可以建立一个专业且一致的品牌形象 创建一个标准的 Twitter 个人数据非常简单 但为了优
  • C——循环结构

    循环结构 1 while循环 2 do while语句 3 for循环 4 break与continue 4 1 break语句 4 2 continue语句 5 嵌套循环 1 while循环 形式 while 条件 语句 执行过程 先判断
  • VSCode中Python环境配置、虚拟环境的创建启动关闭及pip常用命令

    文章目录 工具准备 虚拟环境 pip常用命令 ipykernel库安装 Python迁移项目时有第三方库的做法 pip安装升级相关命令 用pip下载指定版本的包 Python相关包的介绍 1 numpy 参考资料 工具准备 安装 Visua
  • 【python】爬虫实操 完整案例 -- 豆瓣前250电影输出为 .xls文件

    安装包 from bs4 import BeautifulSoup 网页解析 import re 正则表达式 import urllib request urllib error 制定url 获取网页数据 import xlwt 进行exc
  • 微前端运行时

    目录 微前端运行时 基于 SPA 的微前端架构 应用生命周期 微前端运行时 谈到微前端绕不开的话题就是为什么不适用 iframe 作为承载微前端子应用的容器 其实从浏览器原生的方案来说 iframe 不从体验角度上来看几乎是最可靠的微前端方
  • ELK入门

    参考 https www elastic co cn products root server1 6 6 ls apm server 6 6 1 x86 64 rpm kibana 6 6 1 x86 64 rpm auditbeat 6
  • 线程同步(三)

    目录 条件变量 条件变量操作函数函数原型 线程阻塞函数 唤醒阻塞线程 生产者和消费者模型 信号量函数 生产者和消费者模型 总结 条件变量 条件变量是一种线程间同步的机制 用于协调线程之间的操作 当一个线程正在等待某个条件变成真 而另一个线程
  • (struts2学习篇)Struts2资源国际化

    第一步 在Web项目下的src创建国际资源文件 第二步 在struts2 xml布局文件集成资源路径
  • Unity跟随并环绕移动物体

    是一个比较简单的实现办法 方向已经写死了 有需要的自己改吧 思路 在开始游戏时获取和玩家的位置差距的向量 然后再Update中更改位置到指定距离 然后使用RotateRound进行旋转 最后再获取差距向量 形成一个循环 这其中的顺序是很重要
  • ubuntu安装中文输入法

    ubuntu环境 ubuntu20 4 此处安装的是google pinyin输入法 一 安装fcitx googlepinyin 1 安装fcitx googlepinyin sudo apt get install fcitx goog
  • 基于SSM的垃圾分类管理系统源码

    活动地址 毕业季 进击的技术er 博主介绍 在职Java研发工程师 专注于程序设计 源码分享 技术交流 专注于Java技术领域和毕业设计 CSDN官方推荐10W JAVA技术人文章发布打卡社区 项目名称 基于SSM的垃圾分类管理系统源码 视
  • SAE:如何使用phpExcel

    1 把phpExcel的工具类上传到Sae的云服务器 2 然后你要在Storage 上创建一个Bucket 名字你可以自己起 3 上代码 use sinacloud sae Storage as Storage s new SaeStora
  • JavaScript,将rgb颜色字符串转化为16进制

    颜色字符串转换 rgb字符串 gt 16进制 描述 输入 rgb 255 255 255 输出 ffffff 思路 1 rgb中 每个逗号后面空格数不固定 正则表达式中需要考虑匹配空格 2 当输入不符合rgb格式 返回原始输入 3 当输入符
  • apache配置指令速查

    AcceptFilter AcceptFilter 指令 说明 根据协议类型对监听Socket进行优化 语法 AcceptFilter protocol accept filter 作用域 server config 状态 核心 C 模块
  • 全局配置_中兴天机配置公布:智汇屏+全局黑暗模式

    宅男科技12月16日消息 中兴今日正式在其官方社交账号上公布了即将发售的中兴天机Axon 10s Pro 5G的配置参数 并表示新机将于2020年年初正式对外发布 据悉 即将面世的中兴天机Axon 10s Pro 5G将会搭载最新的骁龙86
  • 『Newsletter 丨第二期』PieCloudDB Database 新增控制台、LDAP 支持、虚拟数仓日志等多项功能

    PieCloudDB Database 最新动态 云上云版 控制台 功能上线 PieCloudDB 云上云版 控制台 功能全新上线 控制台集成了组织 数仓 用户 费用 权限等多方位管理功能 支持在一个组织下创建和管理多个数仓 并支持独立的一

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • arduino黑线循迹小车程序_基于arduino的循迹小车(含有PID算法)

    循迹小车一般分为两方面 一方面是简单的闭环赛道只有直道和弯道 另一方面是毕设类型的包括一些元素 90度弯道 十字道路 S形弯道等 本篇博客试根据下图来进行书写的 如果大家有什么新的元素 也可以在下方评论 我进行更新 作者 sumjess 注
  • linux字符串转数字

    转载 https www cnblogs com baofengc p 9042128 html 方法一 echo 96 56 awk print int 0 输出结果 96 方法二 A 2 B 51 let C A B echo C 方法
  • static在c语言中的作用_C语言关键字 static 的用法

    接上文 C语言的32个关键字 C语言 static 关键字的常见用法有三种 用于局部变量的修饰符 用于全局变量的修饰符 用于函数的修饰符 1 用于局部变量的修饰符 当 static 用于修饰局部变量时 通常是在某个函数体内 只能在该函数内被
  • zabbix如何监控linux磁盘性能IO

    前提环境 perl和python 以及zabbix agent已是可用状态 需要主要监控的指标 1 每秒IO数 即iops或tps 2 吞吐率 3 平均IO尺寸 avgrq sz 4 IO等待队列长度 avgqu sz 5 磁盘活动时间百分
  • 阅人有术

    第一部分 阅人 人生的必修课 没有人能隐于世外 无论你走到哪里 都会碰到人 你必须与之相处 因为人无所不在 你必须了解人 因为你永远无法独自成功 不同的人每天都不得不重复着同一个古老而新鲜的游戏 与人打交道 这个游戏的古老在于 人类就是这样
  • Odoo Wizard界面显示带有复选框列表及勾选数据获取 Python

    Odoo Wizard界面显示带有复选框列表及勾选数据获取 Python 在Odoo应用程序中 Wizard 向导 是一种常用的界面元素 用于引导用户完成特定任务 在这篇文章中 我们将学习如何在Odoo的Wizard界面中显示带有复选框列表
  • GoFrame带你从0-1快速入门

    文章目录 GoFrame 带你从 0 1 快速入门 一 GoFrame介绍 1 1GF基本介绍 1 2GF特点 1 3GF地址 1 4GF框架 二 GoFrame基础环境搭建 2 1环境搭建 1 安装golang 2 安装goland 3
  • Java源码分析(二)Double

    本篇是源码分析的第二篇 上篇我们一起分析了Integer类的源码 本篇一起学习下Double类的源码 看下其实现 一 Double类图 首先 相比Integer Double类的源码只有1000 行代码 如下是Integer及其关联类 接口
  • Ubuntu 安装、卸载JDK

    JDK 介绍 Open JDK 和 Oracle JDK区别 OpenJDK是Java开发工具包的开源实现 Oracle JDK是Java开发工具包的官方Oracle版本 尽管OpenJDK已经足够满足大多数的案例 但是许多程序比如Andr
  • 【Java预科】CH01 MarkDown语法

    1 标题 空格 标题名字 空格 二级标题 越多字体越小 最多只到六级 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 七级标题不存在 2 文字 加粗 在目标文字前后加 斜体 在目标文字前后加 斜体 加粗 在目标文字前后加 删除线
  • IOException parsing XML document from ServletContext resource [/<NONE>]; closed - call ‘refresh‘

    问题描述 SpringMVC项目添加ContextLoaderListener后无法启动
  • Qt事件(Event)

    事件Event 1 事件的概述 2 通过QLabel了解事件的操作 3 重写事件 4 重写鼠标按下事件 5 获取鼠标按下或移动的坐标 6 查看的QMouseEvent的信息 7 判断button的返回值 8 判断鼠标的哪个按键按下 9 判断
  • java中的throwable异常和错误

    Java中有个java lang Throwable类 这个类是Java中所有异常和错误的基类 Throwable下有两个大类那就是异常 Exception 和错误 Error Throwable 有两个重要的子类 Exception 异常
  • mysql的docker镜像数据库初始化踩坑记

    一 制作docker镜像 在当前目录新建子目录script 将数据库初始化脚本拷贝进去 后缀名为 sql 脚本执行顺序是按字母大小排序 建议可以按 1 xxx sql 2 xxx sql这样命令 Dockerfile如下 FROM mysq
  • aps和php撒意思?,aps-c画幅是什么意思

    aps c画幅是指数码相机的CCD CMOS 的尺寸与APS的C型画幅大小相仿 在25mmX17mm左右 差不多是全画幅CCD CMOS 面积的一半 也称半幅机 本文演示环境 Windows7系统 Dell G3电脑 APS C画幅意思 A
  • Android前端音视频数据接入GB28181平台意义

    技术背景 在我们研发Android平台GB28181前端音视频接入模块之前 业内听到最多的是 如何用Android或者Windows端 在没有国标IPC设备的前提下 模拟GB28181的信令和媒体流交互流程 实现GB28181整体方案的测试
  • 头文件string与string.h的区别

    头文件string与string h的区别 在C 中 include
  • wayland与linux_Linux最让人叹息的地方

    这两天有空 试了试Sway 作为一直以来的i3用户 自己的使用环境各项配置基本也是该配的都配齐了 本来不以为然 没想到真正去到Sway却发现Wayland确实流畅很多 折腾了1天 满心想着终于来到了一个Tear free的Linux环境 结
  • 表完整性约束

    介绍 认识 约束条件和数据类型宽度一样 都是可选类型 作用 用于保证数据的完整性 一致性 有哪几种约束 primary key PK 标识该字段为该表的主键 可以唯一标识的记录 foreign key FK 标识该字段为该表的外键 not