当前位置: 首页 > news >正文

数据库的约束和设计

约束

  • 作用
    • 对表中的数据进行进一步的限制, 保证数据的正确性, 有效性和完整性
  • 种类
    • primary key : 主键约束
    • unique : 唯一约束
    • not null : 非空约束
    • default : 默认值
    • foreign key : 外键约束
    • auto_increment : 自增约束(适用于int数据类型)

主键约束

  • 特点
    • 非空且唯一
  • 注意事项
    • 通常不用业务字段作为主键, 单独给每张表设计一个id的字段, 把id作为主键; 主键是给数据库和程序使用的, 不是给最终的客户使用的; 所以主键有没有含义没有关系, 只要不重复, 非空就行
    • 每张表都应该有一个主键, 并且每张表只能有一个主键(可以一组字段作为一张表的主键)
1. 在创建表的时候给字段添加主键
create table 表名 (
	字段名 数据类型 primary key,
	字段名 数据类型,
	字段名 数据类型
);
create table 表名 (
	字段名1 数据类型,
	字段名2 数据类型,
	字段名3 数据类型,
	primary key(字段名1, 字段名2)
);

2. 在已有表中添加主键
alter table 表名 add primary key(字段名);
alter table 表名 add primary key(字段名1, 字段名2);

自增约束(主键自增)

  • 作用
    • 能够设置主键为自动增长
    • 主键如果让我们自己添加很有可能重复, 我们通常希望在每次插入新记录时, 数据库自动生成主键字段的值
  • 注意事项
    • 只能给主键添加约束
    • 只能给一列添加自增约束
-- 示例1
create table test1 (
  id int primary key auto_increment,
  name varchar(10),
  age int
);
-- 示例2
alter table test1 modify id int primary key auto_increment;
alter table test1 modify id int auto_increment;

默认值

  • 注意事项
    • 主动插入null 不会被默认值替换
create table test1 (
  id int ,
  name varchar(10),
  age int default 18
);

insert into test1(name, age) values('11', null); -- (null, 11, null)
insert into db4.test1(name) values('22'); -- (null, 22, 18);

表的关系和外键约束

  • 表的关系分为一对一, 一对多和多对多, 在处理多对多关系时我们需要引入第三张表, 作为多对多两张表的桥梁
  • 第三张表需要引入其余两张表的主键作为自己表中的外键
-- 前置条件
create table tb_order (
  id int primary key auto_increment,
  payment double(10, 2),
  payment_type tinyint,
  status tinyint
);

create table tb_goods (
  id int primary key auto_increment,
  title varchar(100),
  price double(10, 2)
);

create table tb_order_goods (
  id int primary key auto_increment,
  order_id int,
  goods_id int,
  count int
);
alter table 表名 add [constraint 约束名称]
foreign key(当前表中的列名) references 被引用的表名(被引用表的列名);

-- 完整写法(给已经存在的表添加外键约束)
alter table tb_order_goods add constraint fk_order_id
foreign key(order_id) references tb_order(id);

alter table tb_order_goods add constraint fk_goods_id
foreign key(goods_id) references tb_goods(id);

-- 省略写法(给已经存在的表添加外键约束)
alter table tb_order_goods add
foreign key(order_id) references tb_order(id);

alter table tb_order_goods add
foreign key(goods_id) references tb_goods(id);
-- 完整写法((创建表时就添加外键约束))
create table tb_order_goods (
  id int primary key auto_increment,
  order_id int,
  goods_id int,
  count int,
  constraint fk_order_id foreign key(order_id) references tb_order(id),
  constraint fk_goods_id foreign key(goods_id) references tb_goods(id)
);

-- 省略写法(创建表时就添加外键约束)
create table tb_order_goods (
  id int primary key auto_increment,
  order_id int,
  goods_id int,
  count int,
  foreign key(order_id) references tb_order(id),
  foreign key(goods_id) references tb_goods(id)
);

在这里插入图片描述

  • 注意事项
    • 添加数据需要先添加主表, 然后添加从表
    • 删除数据需要先删除从表, 然后再删除主表

相关文章:

  • Lesson 1 A private conversation
  • 第一季:9SpringMVC中如何解决POST请求中文乱码问题,GET的又如何处理呢【Java面试题】
  • 看了羊了个羊的源码后我发现这个游戏花了最少钱,赚了最多的钱
  • 『 云原生·分布式』分布式基础——Docker容器详解与Docker的安装(Linux与Windows)
  • Web会话跟踪:Cookie与Session
  • 【大数据】Hadoop在呼唤Hive(附一键部署Hive脚本)
  • 8. SQL中Order by和Group by子句的使用简介
  • 27. 生成CSV文件
  • 【初学者入门C语言】之二维数组(七)
  • 深度学习 Day 14——利用卷神经网络实现运动鞋品牌识别
  • 索引的创建与设计原则(2)(适合创建索引情况 )
  • 写给Python社群的第2课:Python逻辑语句,天天要写的 if 和 while
  • 2022G3锅炉水处理考试练习题模拟考试平台操作
  • C++11:lambda表达式
  • [实践篇]13.6 QNX侧如何抓取日志?
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 10个最佳ES6特性 ES7与ES8的特性
  • Bootstrap JS插件Alert源码分析
  • express.js的介绍及使用
  • IOS评论框不贴底(ios12新bug)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript创建对象的四种方式
  • java小心机(3)| 浅析finalize()
  • Redux 中间件分析
  • Spark学习笔记之相关记录
  • Spring Boot快速入门(一):Hello Spring Boot
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • windows下使用nginx调试简介
  • 浅谈web中前端模板引擎的使用
  • 一个项目push到多个远程Git仓库
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ​Java并发新构件之Exchanger
  • ​TypeScript都不会用,也敢说会前端?
  • #NOIP 2014# day.2 T2 寻找道路
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (转)Google的Objective-C编码规范
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)虚函数剖析
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .equals()到底是什么意思?
  • .NET Core 项目指定SDK版本
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET单元测试
  • .NET面试题(二)
  • .NET命名规范和开发约定
  • .py文件应该怎样打开?
  • ::before和::after 常见的用法
  • @GetMapping和@RequestMapping的区别
  • @synthesize和@dynamic分别有什么作用?
  • @拔赤:Web前端开发十日谈