数据库 表设计 MySQL

news2024/12/27 15:54:38

表设计

约束

为了保证入库数据的合理性,添加的各种规则。

约束的分类

准备测试用的表格:

CREATE TABLE emp (

id INT,  -- 员工id,主键且自增长

    ename VARCHAR(50), -- 员工姓名,非空且唯一

    joindate DATE,  -- 入职日期,非空

    salary DOUBLE(7,2),  -- 工资,非空

    bonus DOUBLE(7,2)  -- 奖金,如果没有将近默认为0

);


DROP TABLE IF EXISTS emp;

CREATE TABLE emp (

  id INT PRIMARY KEY, -- 员工id,主键且自增长

  ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一

  joindate DATE NOT NULL , -- 入职日期,非空

  salary DOUBLE(7,2) NOT NULL , -- 工资,非空

  bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0

);

先插入一条没有问题的数据,验证表格创建的正确性:

INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);


如id就不能为空。非空约束: 关键字是 NOT NULL

添加表字段、修改字段属性和删除约束三种情况的使用方式:

CREATE TABLE 表名(

       列名 数据类型 NOT NULL,

       …

    );

ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;

ALTER TABLE 表名 MODIFY 字段名 数据类型;

 

验证非空约束:

INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000);
 

唯一约束:关键字是  UNIQUE

保证列中没有相同数据。

创建表时添加唯一约束:

CREATE TABLE 表名(

       列名 数据类型 UNIQUE [AUTO_INCREMENT],

       -- AUTO_INCREMENT: 当不指定值时自动增长

       …

    );


ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;建完表后添加唯一约束:

删除唯一约束:

ALTER TABLE 表名 DROP INDEX 字段名;

验证唯一约束:

INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,'李四','1999-11-11',8800,5000);
 

 

主键约束: 关键字是  PRIMARY KEY

一般是id。

创建表时添加主键约束,后面的AUTO_INCREMENT是自增,可以根据实际添加:

CREATE TABLE 表名(

       列名 数据类型 PRIMARY KEY AUTO_INCREMENT,

       …

    );


ALTER TABLE 表名 ADD PRIMARY KEY(字段名);建完表后添加主键约束:

删除主键约束:

ALTER TABLE 表名 DROP PRIMARY KEY;

检查约束: 关键字是  CHECK

保证列中的值满足某一条件。比如年龄大于1小于200。

mysql没有提供支持,实际中在代码层次做校验。

默认约束: 关键字是   DEFAULT

保存数据时,未指定值则采用默认值,比如缺考的人成绩也不能为空,可以给个0作为默认值。

创建表时添加默认约束:

CREATE TABLE 表名(

       列名 数据类型 DEFAULT 默认值,

       …

    );


ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;建完表后添加默认约束

删除默认约束:

ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

验证默认约束:

INSERT INTO emp(id,ename,joindate,salary) values(3,'王五','1999-11-11',8800);


外键约束: 关键字是  FOREIGN KEY

两个表的数据之间建立链接的字段,这样在做删除修改的时候,关联的表就能更好保证一致性。

准备测试数据:

-- 删除表

DROP TABLE IF EXISTS emp;

DROP TABLE IF EXISTS dept;

-- 部门表

CREATE TABLE dept(

id int primary key auto_increment,

dep_name varchar(20),

addr varchar(20)

);

-- 员工表

CREATE TABLE emp(

id int primary key auto_increment,

name varchar(20),

age int,

dep_id int,

-- 添加外键 dep_id,关联 dept 表的id主键

CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)

);


添加数据:

-- 添加 2 个部门

insert into dept(dep_name,addr) values

('研发部','广州'),('销售部', '深圳');

-- 添加员工,dep_id 表示员工所在的部门

INSERT INTO emp (NAME, age, dep_id) VALUES

('张三', 20, 1),

('李四', 20, 1),

('王五', 20, 1),

('赵六', 20, 2),

('孙七', 22, 2),

('周八', 18, 2);


建完表后添加外键约束:


ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);

删除外键约束:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

alter table emp drop FOREIGN key fk_emp_dept;

查看外键关系:

 

选中要查看的表,然后右键,逆向到模型。

表关系

一对多(多对一)

举例:

DROP TABLE IF EXISTS tb_emp;

  DROP TABLE IF EXISTS tb_dept;

  

  -- 部门表

  CREATE TABLE tb_dept(

   id int primary key auto_increment,

   dep_name varchar(20),

   addr varchar(20)

  );

  -- 员工表

  CREATE TABLE tb_emp(

   id int primary key auto_increment,

   name varchar(20),

   age int,

   dep_id int,

  

   -- 添加外键 dep_id,关联 dept 表的id主键

   CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES tb_dept(id)

  );


多对多

举例:

DROP TABLE IF EXISTS tb_order_goods;

  DROP TABLE IF EXISTS tb_order;

  DROP TABLE IF EXISTS tb_goods;

  

  -- 订单表

  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 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);

一对一

先按照多对一去想,然后在多的一端加上唯一的约束:

create table tb_user_desc (

id int primary key auto_increment,

city varchar(20),

edu varchar(10),

income int,

status char(2),

des varchar(100)

);

create table tb_user (

id int primary key auto_increment,

photo varchar(100),

nickname varchar(50),

age int,

gender char(1),

desc_id int unique,

-- 添加外键

CONSTRAINT fk_user_desc FOREIGN KEY(desc_id) REFERENCES tb_user_desc(id)

);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【uniapp】渲染列表数据删除项导致每项数据重置的问题解决方案

开发uniapp项目,使用的是JavaScript Vue写法,操作wList数组列表更新的时候,如果每一项都带input 或 radio组件,要操作移除的话,那么组件的输入数据会被清除重置,若不希望这样,那应该怎么做才好呢…

设计模式相关内容介绍—软件设计原则(六个)

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 目录 1.开闭原则 2.里氏代替原则 3.依赖倒转原则 4.接…

dvwa中的文件包含攻击

环境:dvwa: 192.168.11.135 dvwa版本: Version 1.9 (Release date: 2015-09-19)kail机器:192.168.11.156一、什么是文件包含漏洞?为简化代码,会把重复的code内容单独写到一个页面文件,然后再需要调用重复内容的页面中…

C语言:初识C语言

目录前言1. 什么是c语言呢2. 第一个c语言程序2. 数据类型3. 变量和常量3.1 变量3.1.1 变量的定义3.1.2 变量的分类3.1.3 变量的使用3.1.4 变量的作用域和生命周期3.2 常量4. 字符串、转义字符、注释4.1 字符串4.2 转义字符4.3 注释5. 选择语句6. 循环语句7. 函数8. 数组9. 操作…

学习笔记——keep-alive缓存组件,再次返回组件data数据重置

前言:使用keep-alive缓存组件,当再次返回该组件后,希望其组件中的数据或状态,保持上次离开该组件时的情况。 一、当前组件树 希望缓存HomeMain组件的状态。 二、错误处理 我在HomeMain的祖先组件HomeLayout中,写了如下…

sqlplus 连接数据库

终端直连 Oracle 数据库 ORA-12162 错误 出于各种网络原因,无法直连数据库,但又必须查询数据库数据 我们只能选择直连数据库的服务器 然后通过 sqlplus 连接 Oracle 从配置文件里获取这样一段信息 urljdbc:oracle:thin:192.168.1.3:1521:testdb use…

【SpringCloud08】SpringCloud Consul服务注册与发现

1.Consul简介 1.1是什么 官网 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用Go 语言开发 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位…

基于MPLS-V**多分部互访的ensp企业网络规划与设计_ensp综合实验

作者:BSXY_19计科_陈永跃BSXY_信息学院注:未经允许禁止转发任何内容基于MPLS-V**多分部互访的ensp企业网络规划与设计_ensp综合实验前言及技术/资源下载说明( **未经允许禁止转发任何内容** )插曲:基于eNSP中大型校园/…

卡特加特数字中控主机,数字家庭控制中心!没它智能家居就是智障!

数字中控主机是数字家庭的核心,承担着“协调各方、总揽全局”的作用,是打造未来数字家庭空间必不可少的设备。区别于传统家居智能,它真正意义上告别了过去以设备为中心的架构,而是以人的个性化需求为中心,以数据作为资…

2020统考真题-距离最小三元组

2020年统考真题 定义三元组$ (a,b,c)$ ( a,b,c 均为正数)的距离 D∣a−b∣∣b−c∣∣c−a∣D|a−b||b−c||c−a|D∣a−b∣∣b−c∣∣c−a∣ 。给定 3个非空整数集合 S1 、 S2 和 S3 ,按升序分别存储在 3 个数组中。请设计一个尽可能高效的算…

蓝队攻击的四个阶段(三)

目录 一, 专业技能储备 1.工具开发技能 2.漏洞挖掘技能 3.代码调试技能 4.侦破拓展技能 二,目标网情搜集 1 何为网情搜集 2. 网情搜集的主要工作 三, 网情搜集的途径 1.专业网站 2.专业开发资源网站 3.目标官网 一, 专…

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和 平衡二叉树 110. 平衡二叉树 - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每…

osg fbo(五) 通过shader计算纹理坐标并采样

在前边几节&#xff0c;纹理坐标数组是在生成geometry前指定的。 这里在shader里计算&#xff0c; 一&#xff0c;注释掉geometry中的纹理坐标 //osg::ref_ptr<osg::Vec2Array> texCoord new osg::Vec2Array; //texCoord->push_back(osg::Vec2(0.0, 0.0)); //texCoo…

1.13UART串口实验

UART总线&#xff1a; 异步全双工串行总线。用于芯片与外设之间的通信 UART通信协议&#xff1a; 空闲状态处于高电平 起始位&#xff1a;串口通信的起始标志 数据位&#xff1a;传输数据时先从低位开始传输&#xff0c;再传输高位 奇偶校验位&#xff1a; 奇校验&#x…

MacOS 系统中如何使用EF Core进行数据迁移?

原有 笔者最近在使用MacOS系统做asp.net core mvc项目开发。可是一直习惯了使用宇宙最强大的vs2019工具。突然换到苹果系统就感觉什么都是问题了。现在我将遇到该问题的解决方案做下记录&#xff0c;方便自己也是方便别的同学快速的解决问题。 发现有坑 其实最开始我也是翻阅…

RocketMQ 存储优化技术 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年1月13日 &#x…

Django 后端没有接收到前端anxios的 post 内容

前端使用 vue 无论怎样 post 后端都说没有接收到值&#xff0c;&#xff08;后端接口正确&#xff09; 寻找原因&#xff1a; 1、前端查看自己的请求类型 Content-Type:application/json 我们的请求是这样的&#xff1a; axios({method:post,url:/video/upload,data:{"…

RedHat6配置本地yum源(最新超详细过程)

一、环境准备 挂载iso的镜像文件在CD/DVD驱动器上&#xff0c;需要确保&#xff0c;已连接已打开&#xff0c;且CD/DVD上的介质符合当前操作系统的版本。 挂载本地光盘到系统 在“编辑设置”——>“硬件”——>“CD/DVD驱动器”里指定操作系统的ISO镜像文件 光驱挂载…

web性能测试:Lighthouse测试实践

一工具简介 Lighthouse是Google开源的一个自动化工具&#xff0c;它可以搜集多个Web网页性能指标&#xff0c;分析Web应用的性能并生成报告&#xff0c;为开发人员进行性能优化提供了参考方向。1工作原理•Driver&#xff08;驱动&#xff09;—— 通过 Chrome Debugging Proto…

力扣sql基础篇(六)

力扣sql基础篇(六) 1 学生参加各科测试的次数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 输入示例 b 输出示例 1.2 示例sql语句 # 无论考没考试都要该科目这栏且无连接字段,就可以考虑笛卡尔积了 SELECT s.student_id,s.student_name,s.subject_name,IFNULL…