mysql约束之_外键约束 foreign key

2023-11-01

-- 外键约束(foreign key)
-- 创建一个员工表employee
-- 员工编号id,员工的姓名name,部门名称dept_name,员工所在的地址address
CREATE TABLE employee(
      id INT PRIMARY KEY AUTO_INCREMENT,
      NAME VARCHAR(10),  
      address VARCHAR(20),
      dept_name VARCHAR(20)
);
-- 给员工表中插入数据
INSERT INTO employee (NAME,address,dept_name)
   VALUES('文章','北京','研发部'),
         ('柯发兴','西安','测试部'),
         ('高圆圆','上海','研发部'),
         ('张三','深圳','实施部'),
         ('李四','广州','实施部'),
         ('赵又廷','香港','测试部');
-- 查询员工表中的所有数据
SELECT * FROM employee ;
DROP TABLE employee;

-- 查询 员工的姓名以及所在的部门名称
SELECT 
  NAME '姓名',
  dept_name '部门名称'
FROM
  employee ;
/*
    问题:
        id = 1        研发部
        id = 3        研发部
        
        id = 2        测试部
        id = 6        测试部
        
        ...
        
        字段冗余(重复的内容太多了),查询出来的数据不太直观
*/
-- 将上面这个问题进行改进:将员工表拆分成两个表
-- 员工表:记录员工的信息
-- 部门表:记录部门的编号以及部门的名称
DROP TABLE employee;

-- 部门表:dept表:主键自增长id(部门编号)  dept_name部门名称
CREATE TABLE dept (
  id INT PRIMARY KEY AUTO_INCREMENT,
  dept_name VARCHAR (10)
) ;
DROP TABLE dept;
-- 插入数据
INSERT INTO dept (dept_name) 
VALUES
  ('研发部'),
  ('测试部'),
  ('实施部') ;
SELECT * FROM dept;

-- 创建员工表
CREATE TABLE employee(
     id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
     NAME VARBINARY(10), -- 员工姓名
     address VARBINARY(20), -- 员工地址
     dept_id  INT -- 部门编号
);
INSERT INTO employee (NAME,address,dept_id)
   VALUES('文章','北京',1),
         ('柯发兴','西安',2),
         ('高圆圆','上海',1),
         ('张三','深圳',3),
         ('李四','广州',3),
         ('赵又廷','香港',2);

SELECT *FROM employee;

SELECT 
  NAME '姓名',
  dept_id '部门编号'
FROM
  employee ;

-- 继续改进:想办法需要将部门表中部门编号主键id和员工表的部门表dept_id的关联起来

-- 解决方案:加入外键
-- 主表(部门表:dept),从表employee(外键所在的表)
-- constraint声明 外键名称(主表名称_从表名称_fk)
    -- foreign key (从表的字段) reference 主表的名称(主键名称);
DROP TABLE employee;    
-- 创建员工表并且添加外键约束
CREATE TABLE employee(
   id INT PRIMARY KEY AUTO_INCREMENT,-- 员工编号
    NAME VARBINARY(10), -- 员工姓名
    address VARCHAR(20),-- 员工地址
    dept_id INT,
    CONSTRAINT -- 声明
    dept_emp_fk FOREIGN KEY(dept_id)
    REFERENCES dept(id)
);

-- 给员工表中添加数据
INSERT INTO employee (NAME,address,dept_id)
   VALUES('文章','北京','1'),
         ('柯发兴','西安','2'),
         ('高圆圆','上海','1'),
         ('张三','深圳','3'),
         ('李四','广州','3'),
         ('赵又廷','香港','2');

SELECT *FROM dept;
SELECT*FROM employee;
-- 添加数据(部门编号必须存在,否则报错!)
INSERT INTO employee (NAME,address,dept_id) VALUES ('马伊琍','西安','4');
-- 由于存外键,不能直接添加或者修改从表数据(跟外键声明的字段相关)
-- 先操作主表---->然后才能操作从表
-- 添加的操作
-- 主表
INSERT INTO dept(dept_name)VALUES('销售部');

-- 删除外键
-- alter table 从表名称 DROP FOREIGN KEY 外键名称
ALTER TABLE employee DROP FOREIGN KEY dept_emp_fk;

-- 通过sql语句添加外键
ALTER TABLE employee
    ADD CONSTRAINT -- 声明
        dept_emp_fk FOREIGN KEY(dept_id)
        REFERENCES dept(id);
 

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

mysql约束之_外键约束 foreign key 的相关文章

随机推荐

  • Qt 添加动态库.so文件的正确方法

    1 选中项目 右键 选中 Add Library 完成后 内容自动更新到Pro文件 我原来认为是手写的 qt添加动态库 so文件的正确方法 qt so CSDN博客
  • 软件测试—学习路线

    1 入门期 手工测试 利用测试用例去检验程序是否正确输出结果 通俗来说就是在编写程序结束后自己会运行几个例子来检查程序是否正确运行 而这样的行为就是手工测试 不过企业上手工测试的测试用例会比较刁钻 容易发现自动化测试发现不了的问题 不过这种
  • 用Openssl建立私有CA并颁发证书

    1 建立CA根证书 1 1生成私钥 openssl req newkey rsa 1024 sha1 config myopenssl cnf keyout rootkey pem out rootreq pem days 3650 1 2
  • 联想笔记本Ubuntu14.04 无法连接无线网络,WiFi已通过硬件开关禁用

    最近给一台联想笔记本装Ubuntu14 04系统 开机后屏幕右上角没有WiFi信息出现 倒是有个灰体的 WiFi已通过硬件开关禁用 看到这我的内心奔腾而过一群草原动物 开机就关WiFi 不能连WiFi的笔记本还能搞啥 莫着急 慢慢来 看这字
  • HDFS常见的问题和处理方法积累

    Hadoop常见问题与解决办法 问题1 reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限 问题描述 问题剖析 解决方案 问题2 Too many fetch failures 问题描述 问题剖析 解决方案 问题
  • 解决el-select下拉框有值但是无法选中的问题

    问题描述 在某次开发项目时 发现el select组件无法选中数据了 下拉框中数据可以正常展示 数据是通过接口获取的 解决方案 在 el select 中加一个 change 的事件刷新一下 代码如下
  • top命令的使用和查看某个进程占用的系统内存大小

    一 top指令查看CPU状态和内存使用状态 1 查看CPU占用率 CPU 上次更新到现在的CPU时间占用百分比 2 查看内存占用率 MEM 进程使用的物理内存百分比 3 RES 进程使用的 未被换出的物理内存大小 单位kb RES CODE
  • go通过数组(切片)构建菜单树结构

    有这样的一组节点 每个节点包含自己的Id 还有父Id Parent Id 包含children指针数组 但是children是空 需要根据id和parentId把cihldren填充上 实现了如下的方法 type TreeNode inte
  • JAVA TCP客户端和服务器端简单实例

    客户端 package com example demo import java io BufferedReader import java io InputStreamReader import java io PrintWriter i
  • 详解Java中的byte类型(补充内容)

    写在前面 大家有时候可能会对Java中出现的byte类型有些疑惑 今天就来内化这些知识点 这个算是对其他博客的一个补充 内容很少 byte 在Java中 byte占据一个字节 也就是8的bite位 public static void ma
  • Kaiwii

    http blog csdn net kaiwii article details 7478038
  • qt 16进制字符串 转换为 二进制 字节流

    代码 include
  • 找出10个被打乱的数中被拿出的一个数

    include
  • RuoYi-弹出新窗口选择数据回显到父页面

    这里只贴出关键代码 其他代码需要自行编写 返回值处理根据实际需求来 目前是只取第一条 因为选择页面是单选行 表单页面新加方法 选择社区 function selectCommunity var url ctx community selec
  • 深度

    解码区块链 专题文章三 区块链的安全基础架构及构想 近期 国家发改委明确 区块链 被纳入新基建定义和范围 作为一项能够打通各个技术及领域的基础技术 区块链被认为将在各行业深度融合 新领域拓展 新场景新应用开发等方面潜力无限 解码区块链 内容
  • js 小技巧 ( 根据不同的状态生成不同的颜色和状态 )

    HTML 解决办法 动态绑定 color 然后 根据 三元表达式 进行处理 js 解决办法 动态绑定 color 然后 根据在每个数据的后面添加color属性 可能有的人会问vueb不能用不然不会双向绑定 确实vue要使用vueset 但是
  • 他人工作多年后的总结

    1 找一个好公司 精通至少一门语言及其框架 专注做5到10年 先有深度再有广度 不要为了高工资过早转向管理角色 2 从长远来看 拥有个人项目 阅读 写博客和参加访谈都会有助于你成为一个更好的开发人员 3 成为开发者社区的一部分 努力参加线上
  • qt写C++(引用的妙处,内联函数)

    首先看什么是引用 引用和取地址很像 容易混淆 单独出现 a就是对a这个变量取地址 如果是int a 就是声明这是一个引用 引用 include
  • 基于SpringBoot+redis实现一个简单的点赞功能

    点赞操作比较频繁 而且比较随意 所以数据变更很快 如果用mysql 会对mysql产生很大的压力 于是决定使用Redis 防止数据丢失 所以会定期将数据持久化同步到mysql中 一 Redis 缓存设计及实现 1 1 Redis 安装及运行
  • mysql约束之_外键约束 foreign key

    外键约束 foreign key 创建一个员工表employee 员工编号id 员工的姓名name 部门名称dept name 员工所在的地址address CREATE TABLE employee id INT PRIMARY KEY