简单说一下使用外键的好处

1、完整性约束

比如:
用户表中有字段 用户编号(id) , 名称(username)
设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号(user_id)

把设备表中的用户编号设置成外键,引用用户表的主键。
当向设备表中输入数据时,如果输入用户编号在用户表中找不到对应的话,就会报错,从而能保证这个设备必定会属于一个存在的用户。

2、可以实现级联删除

还引用上面的例子,当一个用户不在使用该系统时,需要将用户和他的设备从数据库删除,如果不使用外键,需要分别从用户表和设备表中删除数据,如果使用外键,只需要删除用户,引用用户表的主键做为外键的数据表中的相应数据也会自动删除,只需要操作一次数据表。

还有就是在phpMyadmin中暂时还没有直接设置外键的功能,可以通过命令行的方式来修改,格式如下
alter table 表名
add foreign key 字段 references 表名(字段)

使用Navicat 工具可以很方便的设置外键:
鼠标右键打开设计表的界面。

上面的选项卡选择外键就能添加

不过我在添加外键的时候,遇到了问题

我先创建了两个表tb_user 和 tb_device,存储引擎都是InnoDB,且都有user_id这个属性(类型完全一样),添加外键的时候 出现了错误

ERROR : Cannot add or update a child row: a foreign key constraint fails

最后才发现,原来是我的tb_device表中已经存在了数据,因此如果添加外键,就会导致错误。
解决的办法
删除数据,再添加外键

Mysql添加外键约束的更多相关文章

  1. mysql添加外键约束变为索引

    今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter  table table_name1  engine=inno ...

  2. 使用Navicat for MySQL添加外键约束

    转载:http://blog.csdn.net/u013215018/article/details/54981216 现在有两个表一张是Roles表(角色表),一张是RoleUser表(用户角色) ...

  3. MySQL 添加外键约束,不检查现有数据

    这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHE ...

  4. MySQL8.0数据库出现的问题——外码创建方式、外键约束两个引用列不兼容问题、check约束问题、用触发器代替check约束、关键字DELIMITER、删除添加索引、删除添加外键约束、和一些数据库方面的操作

    一.首先先说一下我们都需要建立那些表 mysql> CREATE TABLE IF NOT EXISTS `student`( -> `sno` CHAR(8) NOT NULL, -&g ...

  5. mysql添加外键无法成功的原因

    最近很忙,碰到很多问题都忘了发上来做个记录,现在又忘了,FUCK,现在碰到一个问题, 就是mysql添加外键总是无法成功,我什么都试了,就是没注意signed和unsigned,FUCK,因为我用my ...

  6. mysql添加外键的4种方式

    今天开始复习,在过后的几天里开始在博客上记录一下平时疏忽的知识点,温故而知新 屁话不多--直接上货 创建主表: 班级 CREATE TABLE class(cid INT PRIMARY KEY AU ...

  7. MySQL中MyISAM与InnoDB区别及选择,mysql添加外键

    InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...

  8. MySQL 建立外键约束

    http://www.jzxue.com/shujuku/mysql/201109/06-8742.html MySQL 建立外键约束的语法太晦涩难懂了, 不得不记下笔记. 1. 在建表时建立外键 C ...

  9. mysql添加外键语句

    sql语句格式: · 添加外键约束:alter table 从表 add constraint 外键(形如:FK_从表_主表) foreign key (从表外键字段) references 主表(主 ...

随机推荐

  1. No handlers could be found for logger "keystoneauth.identity.generic.base"

    一般是因为发现了多个keystone的url造成的.

  2. 【架构】RPC 使用 Haproxy、keepalive作为负载均衡

    参考资料: Haproxy+keepalived 高可用负载:  http://www.tuicool.com/articles/qY7Rz23 keepalived原理(主从配置+haproxy)及 ...

  3. 【GoLang】GoLang for 中有多个循环变量怎么处理?

    代码示例: sum := , ; i <= && j <= ; i, j = i+, j- { t.Log("i: ", i) t.Log(" ...

  4. Java for LeetCode 204 Count Primes

    Description: Count the number of prime numbers less than a non-negative number, n. 解题思路: 空间换时间,开一个空间 ...

  5. winrt 真正的绑定任意命令

    下载codeplex上的winrttrigger开源控件 Winrt.Tirgger.EventTrigger trigger = new Winrt.Tirgger.EventTrigger();  ...

  6. ABAP ALV单个单元格状态编辑-简单版本

    *&---------------------------------------------------------------------* *& Report  ZPPR0024 ...

  7. 如何让两个 并列的div高度相等

    哪个div Height值大,就将其值赋给Height值小的div,从而使2个div高度始终保持一致. function $(id){ return document.getElementById(i ...

  8. Zookeeper WINDOWS 安装配置

    下载:zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 解压zo ...

  9. Android笔记:管理所有活动

    以关闭所有活动为例 public class ActivityCollector { public static List<Activity> activities = new Array ...

  10. [Android Pro] Android 4.3 NotificationListenerService使用详解

    reference to : http://blog.csdn.net/yihongyuelan/article/details/40977323 概况 Android在4.3的版本中(即API 18 ...