mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1,创建表时加入的约束

a) 非空约束,not null

b) 唯一约束,unique

c) 主键约束,primary key

d) 外键约束,foreign key

1,非空约束,针对某个字段设置其值不为空,如:学生的姓名不能为空

drop table if existst_student;create tablet_student(

student_idint(10),

student_namevarchar(20) not null,

sexchar(2) default 'm',

birthday date,

emailvarchar(30),

classes_idint(3)

)

反例,如果插入时 student_name为空违反了约束则报错

insert intot_student(student_id, birthday, email, classes_id)values(1002, '1988-01-01', 'qqq@163.com', 10)

2,唯一性约束,它可以使某个字段的值不能重复,如:email不能重复

drop table if existst_student;create tablet_student(

student_idint(10),

student_namevarchar(20) not null,

sexchar(2) default 'm',

birthday date,

emailvarchar(30) unique,

classes_idint(3)

)

drop table if existst_student;create tablet_student(

student_idint(10),

student_namevarchar(20) not null,

sexchar(2) default 'm',

birthday date,

emailvarchar(30) ,

classes_idint(3) ,constraint email_unique unique(email)/*表级约束*/

3,主键约束

每个表应该具有主键,主键可以标识记录的唯一性,主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。

drop table if existst_student;create tablet_student()

student_idint(10) primary key,/*列级约束*/student_namevarchar(20) not null,

sexchar(2) default 'm',

birthday date,

emailvarchar(30) ,

classes_idint(3)

)

或者

drop table if existst_student;create tablet_student(

student_idint(10),

student_namevarchar(20) not null,

sexchar(2) default 'm',

birthday date,

emailvarchar(30) ,

classes_idint(3),CONSTRAINT p_id PRIMARY key (student_id)/*表级约束*/)

4,外键约束

外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键。

首先建立班级表t_classes

drop table if existst_classes;create tablet_classes(

classes_idint(3),

classes_namevarchar(40),constraint pk_classes_id primary key(classes_id)

)

在t_student中加入外键约束

drop table if existst_student;create tablet_student(

student_idint(10),

student_namevarchar(20),

sexchar(2),

birthday date,

emailvarchar(30),

classes_idint(3),constraint student_id_pk primary key(student_id),constraint fk_classes_id foreign key(classes_id) referencest_classes(classes_id)

)

当我们向t_student中加入数据

insert into

t_student(student_id, student_name, sex, birthday, email, classes_id)

values(1001, 'zhangsan', 'm', '1988-01-01', 'qqq@163.com', 10)

出现错误,因为在班级表中不存在班级编号为10班级,外键约束起到了作用

存在外键的表就是子表,参照的表就是父表,所以存在一个父子关系,也就是主从关系,主表就是班级表,从表就是学生表。

上面的例子中如果插入的时候把外键值设为null,可以插入成功。成功的插入了学生信息,但是classes_id没有值,这样会影响参照完整性,所以我们建议将外键字段设置为非空。

当需要删除班级数据,也会报错,因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除子表中的引用记录,再修改父表中的数据。

因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除父表,那么将会影响子表的参照完整性,所以正确的做法是,先删除子表中的数据,再删除父表中的数据,采用drop table也不行,必须先drop子表,再drop父表

例如级联更新

mysql对有些约束的修改比较麻烦,所以我们可以先删除,再添加alter table t_student drop foreign keyfk_classes_id;alter table t_student add constraint fk_classes_id_1 foreign key(classes_id) references t_classes(classes_id) on update cascade;

86a5393bf2cfb008689dadf9faf4de08.png

级联之后,我们只修改了父表中的数据,但是子表中的数据也会跟着变动。

2,需不需要外键

主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,

矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。

正方观点:

1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。

eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?

2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。

3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

反方观点:

1,可以用触发器或应用程序保证数据的完整性

2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题

3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)

eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!

结论:

1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。

2,用外键要适当,不能过分追求

3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。

需要注意的是:MySQL允许使用外键,但是为了完整性检验的目的,在除了InnoDB表类型之外的所有表类型中都忽略了这个功能。这可能有些怪异,实际上却非常正常:对于数据库的所有外键的每次插入、更新和删除后,进行完整性检查是一个耗费时间和资源的过程,它可能影响性能,特别是当处理复杂的或者是缠绕的连接树时。因而,用户可以在表的基础上,选择适合于特定需求的最好结合。所以,如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型

转自;https://www.cnblogs.com/fuland/p/4280434.html

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

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

相关文章

minecraft_MineCraft和堆外内存

minecraft总览 MineCraft是一个很好的例子,说明何时使用堆外内存确实可以提供帮助。 关键要求是: 保留的数据大部分是一个简单的数据结构(在Minecraft的情况下,其很多字节[]) 堆外内存的使用可以隐藏在抽象中。 考试…

win2008 mysql_mysql5.7.17在win2008R2的64位系统安装与配置实例

脚本之家已经给大家讲解过MYSQL其他版本在各种环境中的安装过程,大家可以参阅正文下面的相关文章,今天一起来学习下mysql5.7.17的实例安装教学,配置上稍微不同,希望能够帮助到你。安装MySql操作系统:Windows Server 20…

结构性错误

团队成员在使用以下代码时遇到了麻烦: void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUr…

mysql小计_使用SQL实现小计,合计以及排序_MySQL

bitsCN.com--说明:个人学习笔记,实现小计合计显示,分组按BANK_IDOP_DATE升序排序--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELECT 1111,0…

mule和activemq_Mule ESB,ActiveMQ和DLQ

mule和activemq在本文中,我将展示一个简单的Mule ESB流程,以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例(如果没有,则可以在此处下载一个版本)。 在此示例中,我…

MySQL倒序如何避免filesort_如何避免mysql查询的filesort?

我用不同的参数使用这种查询:EXPLAIN SELECT SQL_NO_CACHE ilan_genel.id , ilan_genel.durum , ilan_genel.kategori , ilan_genel.tip , ilan_genel.ozellik , ilan_genel.m2 , ilan_genel.fiyat , ilan_genel.baslik , ilan_genel.ilce , ilan_genel.parabirimi …

在Java中键入Safe SQL

字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,最终都将SQL语句声明为Java String。 这种方法的问题在于,您必须为每个语句编写测试,以确保它甚至是有效的SQL。 没有编…

springmvc怎么设置更改了界面不用重启_Microsoft Visual Studio 2019 更改语言包

第一次写文章,如有格式等问题,请多多包含与指点!很多人在编程时更喜欢英文界面,认为与编程语言具有相同的语境,更顺手。但是,在更改环境显示语言时,可能会遇到一些障碍,例如我之前在…

苹果电脑怎么删除软件_误格式化,删除文件怎么恢复?3款最好用的数据恢复软件推荐...

1、EasyRecovery一款威力非常强大的硬盘数据恢复工具,能够恢复丢失的数据以及重建文件系统。主要体现在可以从被病毒破坏或是已经格式化的硬盘中恢复数据。EasyRecovery在使用过程中不会在原始的驱动器中写入任何东西,其主要是在内存中重建文件分区表使数…

设计模式 生成器_生成器设计模式的应用

设计模式 生成器嗨,您好! 今天,我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中,我将提供一个很小的构建器模式框架,因此您随时可以回到这里并…

C++ Qt全局异常处理器_QT教程

点击上方 蓝字关注我们今日资源今天的资源是另一套QT教程,某马发的,网上搜集到的。这已经是这个公众号发放的第三套QT教程了。关于QT:Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面…

无线设置 用户_无线WiFi远距离无线蹭网怎么中继桥接组网【详细介绍】

自从小编每天分享各种各样的无线无线WiFi蹭网、桥接、远距离组网等实例,吸引了很多朋友的兴趣,有很多网友通过关心我后,给我私信,求助我一些相关的问题,还有一些朋友建议我出一些教程。首先小编觉得有些东西只能意会不…

应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1

《点赞应用》app是一款实用的视频生成器工具,用户可以利用它为自己的视频添加各种各样的点赞效果。应用内含有多种类型的模板,都是免费使用的,想要将你的视频变得更有趣吗?快来下载体验一下这款应用吧!软件特色1、这个…

SQL即服务

自2007年以来,我一直在考虑这一点,大约在Amazon 推出 S3时。 我什至尝试实现了几次,但是在设计阶段之后就失败了。 我听说过一家初创公司,也曾尝试这样做,但也失败了 。 我仍然不确定是否可以这样做,但是它…

c++ vector 一部分_《JACS》:在富电子C-H键位点上实现光控活性聚合

可逆加成-断裂链转移(RAFT)自由基活性聚合是一种调控聚合物结构组成、分子量和分布的重要聚合方法,其中,光诱导电子/能量转移(PET)的RAFT聚合反应是一种更精确的调控手段,因而经常被用于设计具有复杂3D分子结构的聚合物。然而常规的PET-RAFT法…

phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置

忘记phpmyadmin密码怎么重置,新密码,教程,相关文章,重新启动,跳过忘记phpmyadmin密码怎么重置易采站长站,站长之家为您整理了忘记phpmyadmin密码怎么重置的相关内容。1、停止mysql服务:/etc/init.d/mysql stop2、跳过验证启动MySQL/usr/local/mysql/bin/…

纵横免root框架打不开应用怎么办_很好用的软件多开神奇安卓欧皇十框架!!!...

欧皇十框架这是一款兼容安卓10的应用框架,轻松实现应用多开,可以完美免ROOT运行GG修改器,专为和平精英游戏设计,软件体积小,运行稳定。修改说明:1.支持更多应用游戏的多开、双开,使用更稳定、快…

电脑无internet访问_电脑中的代理服务器怎么设置 代理服务器设置方法 - 操作系统...

如何设置电脑中的代理服务器?对于代理服务器,可能大家对其并不是非常了解,其实代理服务器作为一种特殊的网络服务,可以代理网络用户去获取网络信息,提高浏览速度与效率,而且还可以突破自身IP的访问限制,访…

mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义

展开全部先进先出(62616964757a686964616fe58685e5aeb931333433653339FIFO,first-in,first-out)为处理从队列或堆栈发出的程序工作要求的一种方法,它使最早的要求被最先处理。后进先出,从栈中取出数据项的顺序与将它们插入栈的顺序…

敲代码时如何快速移动光标_如何用 Linux 技巧大大提高工作效率?

前言Linux中的一些小技巧可以大大提高你的工作效率,本文就细数那些提高效率或者简单却有效的Linux技巧。命令编辑及光标移动这里有很多快捷键可以帮我们修正自己的命令。接下来使用光标二字代替光标的位置。删除从开头到光标处的命令文本ctrl u,例如&am…