数据库 表设计 MySQL
表设计
约束
为了保证入库数据的合理性,添加的各种规则。
约束的分类
准备测试用的表格:
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)
);
数据库 表设计 MySQL相关推荐
- [云盘]协议包和数据库表设计
协议 登录用户 注册用户 我的文件 我的文件展示页面 服务器返回给前端 秒传 上传文件 共享列表 文件相关操作 分享文件 删除文件 pv字段处理 数据库表设计 MySQL数据库 用户信息表 user ...
- MySQL - 数据库表设计 - 范式
目录 一.数据库设计的重要性 二.范式 - 简介: 1.什么是范式? 第一范式 - 单一列 第二范式 - 中间表 - 一对多 第三范式 - 不产生中间表 - 一对一.多对一 三.数据库表设计的注意要点 ...
- MySQL数据库表设计
MySQL数据库表设计 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要 ...
- mysql设计积分兑换表_积分系统数据库表设计.docx
积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...
- mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构 | 学步园
两难的境界:不定字段数目的数据库表设计和数据结构 昨天项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大.当时讨论的结果是可能采用四种技术: 动态增加数据库 ...
- mysql表设计原子性_数据库表设计-原子性
好的数据结构会影响速度.好的数据库表设计会影响数据库操作效率.特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂. SQL是关系数据库中用到的一种语言.所以,为 ...
- 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区
数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...
- 万字归纳总结 | 数据库表设计与SQL编写技巧
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 前言 随着移动云平台系统业务不断增长,必然需要对各系统进行 ...
- (转载)工具使用:Oracle数据库表转换为Mysql
https://blog.csdn.net/qq_28194001/article/details/79124090 最近新进的一个项目组中,需要将表结构从Oracle数据库迁移到Mysql,但是由于 ...
最新文章
- 玩嗨的2亿快手“老铁”和幕后的极致视觉算法
- SAP MM 史上最偷懒的盘点事务代码MI10
- 在linux和windows下自动备份数据库
- python类中成员的的调用
- 文巾解题 8. 字符串转换整数 (atoi)
- 2022年美国大学生数学建模竞赛——Problem E:林业固碳
- 大数据技术hadoop入门级生态圈介绍
- 对话王晶:音频人才亟待培养,高水平研究人员尤其欠缺
- 大数据:Parquet文件存储格式
- 两向量点乘坐标运算_高三数学冲刺复习之向量小题的题型总结(含好用的补充公式)...
- 蓝牙技术联盟宣布开放蓝牙网关架构 IoT设备无须Wi-Fi即可联网
- fatal: unable to access ‘https://github.com/abseil/abseil-cpp.git/‘: Failed connect to github.com:44
- Tomcat安装及环境配置(详细教程)
- 微信小游戏开发指南(二)微信小游戏常见问题解答
- win10 查看电脑mac 地址和ip
- 柔性自动化生产线及工业机器人应用实训系统(八站)
- linux if 括号用法总结
- boseqc35能不能连电脑_boseQC35耳机不能连接win10电脑如何解决
- flask_web 蓝本基模板继承问题
- 如何用计算机做曲面图,#平面设计图#在电脑上怎么做设计图?