当数据库遇上外键

现在在一个数据库中,用以下命令建两张表(课程性质和grade表)

关系如下图所示:(grade中的课程性质是课程性质表的外键)

建表语句如下:

DROP TABLE IF EXISTS `课程性质`;

CREATE TABLE `课程性质` (

`id` int(11) NOT NULL,

`课程性质` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `课程性质` (`课程性质`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `grade`;

CREATE TABLE `grade` (

`课程代码` varchar(6) NOT NULL,

`课程名称` varchar(50) DEFAULT NULL,

`课程性质` varchar(30) DEFAULT NULL,

`期末成绩` double DEFAULT NULL,

`总评成绩` double DEFAULT NULL,

`课程学分` double DEFAULT NULL,

PRIMARY KEY (`课程代码`),

KEY `课程性质` (`课程性质`),

CONSTRAINT `grade_ibfk_1` FOREIGN KEY (`课程性质`) REFERENCES `课程性质` (`课程性质`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当你想在grade表中插入以下的记录的时候:运行如下语句

(语句一)

INSERT INTO `grade` VALUES (‘000042‘, ‘大学语文‘, ‘通识教育必修课‘, ‘78‘, ‘78‘, ‘2‘);

这时你发现插入不了,发现你有外键依赖不能插入该记录

所以你先执行如下:运行如下语句

(语句二)

INSERT INTO `课程性质` VALUES (‘1‘, ‘通识教育必修课‘);

这时你可能以为这次再次运行(语句一)

INSERT INTO `grade` VALUES (‘000042‘, ‘大学语文‘, ‘通识教育必修课‘, ‘78‘, ‘78‘, ‘2‘);

没问题了吧?

你发现还是错了!!!(不要担心,这还是可恶的外键搞得鬼)

最后你会百度得到以下解决方案

原来要改成如下语句才可实现你所想要达成的效果

(语句三)

INSERT INTO `grade` VALUES (‘000042‘, ‘大学语文‘,(select  `课程性质` from  `课程性质` where  `课程性质`=‘通识教育必修课‘), ‘78‘, ‘78‘, ‘2‘);

这下你会发现真的可以了。

综上所述,建立外键是个可以建立数据库中列与列的限制关系,但是无疑会增加服务器资源的消耗,编写sql语句的复杂度增加,所以在大型的数据库中能少用则少用。

时间: 2024-12-21 00:38:40

当数据库遇上外键的相关文章

当数据库遇上云计算 网亿兴云解决方案

数据库遇上云计算 网亿兴云解决方案 [日期:2016-07-21] 来源: 中关村在线  作者: [字体:大 中 小] 人们对数据管理的需求由来已久.1950年,雷明顿兰德公司在"Univac I"计算机上推出了磁带驱动器,每秒可以输入数百条记录.六十年代,计算机开始广泛引用于数据管理,传统的文件系统已经不能满足人们的需要,能够统一管理和共享数据的数据库管理系统应运而生.如今,数据已经不再是简单的储存和管理,基于云的数据库正衍生出越来越多的玩法和应用场景. 数据库遇上云计算 网亿兴云解

数据库中使用外键和不使用外键有什么区别

今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因.这是一篇关于是否使用外键的讨论,讲的很有道理:对于主/外键/索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?大家共同观点:主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,矛盾焦点:数据库设计是否需要外键.这里有两个问题:一个是如何

MySQL导入数据库--开启/关闭外键约束

今天从服务器上面以SQL文件导出数据库时,发现导入失败,提示insert 语句执行错误, 插入数据时内容有外键关联,无法插入数据. 可以通过设置MySQL的外键约束的方法来进行设置. mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS) 禁用外键约束: SET FOREIGN_KEY_CHECKS=0; 启用外键约束: SET FOREIGN_KEY_CHECKS=1; 查看当前外键约束的值: SELECT @@FOREIGN_KEY_CHECKS; 用SQLyog导出数据

SQL Server数据库学习笔记-外键

关于主键的话大家很好理解,主键的主要作用就是用来标识一条数据是唯一的,也就是保证数据的实体完整性.防止数据重复.但是外键的话就有许多的疑问了,那外键是咋回事儿呢? 1. 外键的定义: 外键(FK)是用于建立和加强两个表数据之间连接的一列或多列.通过将保存表中主键值的一列或多列中的值添加到另一个表中,可创建两个表之间的连接.这个列就成为第二个表的外键.它表示了两个表之间的关系. 2. 为什么要使用外键? 为了保证数据的参照完整性.补充:参照的完整性要求关系中不允许引用不存在的实体.与实体完整性是关

数据库 SQLserver 主外键 子查询

use lianxigo--创建部门表create table bumen ( bmcode int primary key,  --部门编号  bmname varchar(20),  --部门名字 bmceo varchar(20),  --部门主管 bmtel varchar(20),  --部门电话)go--创建人员表create table renyuan( code int primary key identity(1001,1),  --员工编号 name varchar (20)

sql 数据库查看主外键关联

SELECT 主键列ID=b.rkey ,主键列名=(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid) ,外键表ID=b.fkeyid ,外键表名称=object_name(b.fkeyid) ,外键列ID=b.fkey ,外键列名=(SELECT name FROM syscolumns WHERE colid=b.fkey AND id=b.fkeyid) ,级联更新=ObjectProperty(a.id,'Cn

Entity Framework code first设置不在数据库中生成外键

你现在用的EF是什么版本?我用EF6,你可以重写SqlServerMigrationSqlGenerator的生成外键和更新外键的方法,把不需要的表都过滤掉不就ok了? 1 public class ExtendedSqlGenerator : SqlServerMigrationSqlGenerator 2 { 3 #region 外键 4 protected override void Generate(DropForeignKeyOperation dropForeignKeyOperat

django_4数据库2——表外键

表关系: many to one many to many one to one many to one 记录是如何创建出来的?      先创建one,在在创建many,创建时加入ForeignKey from django.db import models # Create your models here. class Enter(models): name = models.CharField(max_length=30) def __str__(self): return self.n

(转)数据库该不该用外键

外键这个东西让多少程序员又爱又恨,虽然高效的保证了数据库的完整性,一度让我们觉得有了它,维护数据库是多么幸福的一件事情,我们不需要写那么多繁琐的代码来保证数据的完整性.可是随着我们的系统逐渐庞大,我们又发现它给我们带来了不少麻烦,复杂度.性能都受到了影响,于是我们就产生了到底该不该用外键的疑问. 不管是我们做程序设计的,还是社会上的各行各业,或是任何一件事情都是有一个度的约束.上学的时候政治课上总是在说事物都是具有两面性的,好的一面有,当然坏的一面也有,于是外键这个东西自然也逃不出这个道道.在我