如何构建一个完善的数据库,如何来处理表与表关系.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何构建一个完善的数据库,如何来处理表与表关系.相关的知识,希望对你有一定的参考价值。
在SQL里,如何对一个系统的数据进行构建,要考虑哪些东西,要做哪些准备工作~?越详细越好!
SQL Server本身就是一个完善的数据库,提供可视化编程,后台完成所有拖放处理操作,不管有没有数据都可以使用,不需要编译。
一个比较合理的数据库设计应该考虑数据的交互性和挖掘能力、处理效率以及日志记录。
建立数据表,注意以下几点:
表建立的时候要有主键和索引,表与表之间要能使用主键相联系,举例说在A表里我做完一次记录要生成一个单号,B表里面是依据单号来做下一个流程,而不是依据记录的每一条数据
取名尽量使用英文+下划线,SQL Server里对汉字需要转码,影响工作效率,按照他的默认编码方式操作有助于提高数据处理速度
建立数据表的列数不要太多,用编码规则来建立逻辑
注意字段存储空间,限制字段长度,少用注释和image
存储过程尽量简洁实用
建立视图,为了别的客户端使用,尽量建立视图,做好完整的数据分析,别的接口程序或者客户端直接就可以拿去使用。做视图注意几点:
多个表操作写在一个视图里,不要嵌套太多视图
连接查询要适当的筛选
跨服务器操作视图,要建立服务器链接表,尽量使用内网链接,把服务器链接表做成查询视图,放在本地服务器数据库里,这样就等同本地操作
视图之间保留连接字段作为主要索引
建立计划作业,有计划地进行数据同步更新和备份标识工作,注意事项:
备份数据尽量放数据库里同步复制
计划任务避开工作高峰期
建立存储过程,记录操作日志,把日志以数据表的形式存储,注意事项:
存储过程对本表操作,不要交互太多表
精简参数数量,注意参数存储空间
对记录修改删除、更新标记的时候尽量使用时间来索引
建立关系图,给表与表之间建立直接关系,整理整体挖掘数据性能。
建立计划更新任务,优化数据库整体性能。
Access能够存取 Access/Jet、Microsoft SQL Server、Oracle(甲骨文软件公司),或者任何 ODBC 兼容数据库内的资料。熟练的软件设计师和资料分析师利用它来开发应用软件,而一些不熟练的程序员和非程序员的"进阶用户"则能使用它来开发简单的应用软件。虽然它支援部份面向对象(OO)技术,但是未能成为一种完整的面向对象开发工具。
其实Access 也是微软公司另一个通讯程序的名字,想与 ProComm 以及其他类似程序来竞争。可是事后微软证实这是个失败计划,并且将它中止。数年后他们把名字重新命名于数据库软件。
[编辑本段]概述
Access 是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS),是Office系列应用软件之一。它提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象;提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化;为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务。
access,一种交换机的主干道模式。2台交换机的2个端口之间是否能够建立干道连接,取决于这2个端口模式的组合。常见的还有
(普通)access
(干道) Trunk
(自适应) Dynamic-auto
(期望)Dynamic-desirable
[编辑本段]历史
Microsoft Access 1.0 版本在1992年11月发布。
微软指定它对系统最小要求为视窗3.0配以4兆节内存.6兆节内存配以最小8兆节硬盘空间(建议最好有14兆节硬盘空间)则为建议的系统要求.当时软件以7张1.44兆节软碟发布的载体.
这个软件能够有效地处理大量记录但是测试显示在某些情况下会导致数据损毁.比如说,大小超过700MB的文件常会出问题。(值得注意的是在1.0版广泛应用的时候大多数硬盘是小于700MB的。)软件的使用指南指出过时的设备驱动和错误的配置可能回导致数据丢失。
Access的最初名称是Cirrus。它开发于Visual Basic之前,当时的窗口引擎称作Ruby。比尔盖茨看过Ruby的原型后决定把这个基于Basic语言的组件作为一个独立的可扩展应用程序与Access联合开发。这个项目称作Thunder。这两个项目互相独立的被作为底层的窗口引擎开发并且互不兼容。 然而,在VBA出现后它们被合并在一起。
1995年末,access 95发布,这是世界上第一个32为关系型数据库管理系统,使得access的应用得到了普及和继续发展。
1997年,access 97发布。它的最大特点是在access数据库中开始支持web技术,这一技术上的发展,开拓了access数据库从桌面向网络的发展。
21世纪初,microsoft发布access2000,这是微软强大的桌面数据库管理系统的第六代产品,也是32为位access的第三个版本。至此,access在桌面关系型数据库的领域的普及已经跃上了一个新台阶。
2003年微软正式发布了access 2003,这是继2002年后发布的最新版本,它在继承了以前版本的有点外,又新增了一些使用功能
[编辑本段]用途
Microsoft Access在很多地方得到广泛使用,例如小型企业,大公司的部门,和喜爱编程的开发人员专门利用它来制作处理数据的桌面系统。它也常被用来开发简单的WEB应用程序.这些应用程序都利用ASP技术在Internet Information Services运行.比较复杂的WEB应用程序则使用php/mysql或者ASP/Microsoft SQL Server.
它的使用方便程度和强大的设计工具为初级程序员提供许多功能。不过,这种便于使用可能使人误解。这类开发者都是没有在应用或者数据设计方面训练的办公室从业人员。因此许多人以为这样的开发者能够创造可用的系统,但也有很多人认为工具本身的局限性产生了这样的误导。
一些专业的应用程序开发人员使用 Access 用作 快速应用开发,特别是给街道上的推销员制作一个初型或独立应用程序的工具。可是如果是透个网络存取数据的话,Access 的可扩放性并不高.因此当程序被较多使用者使用时,他们的选择多会是倾向于一些客户端-服务器为本的方案,例如 Oracle、DB2、Microsoft SQL Server、Windows SharePoint Services、PostgreSQL、MySQL、Alpha Five、MaxDB,或者Filemaker。无论如何,不少 Access 的功能(表单,报告,序列和VB代码)可以用作其他数据库的后期应用,包括 JET(档案为主的数据库引擎,Access 缺省使用)、Microsoft SQL Server、Oracle和任何其他跟ODBC兼容的产品。这种方法允许开发者把一个成熟的应用的数据移动到一台更大功率的服务器而没有已经在适当的位置牺牲发展。
很多开发者谁使用Microsoft Access使用Leszynski命名约定,虽然这不普遍;它是一次编程大会,并非一个DBMS实施的规章。
[编辑本段]特性
一好处进入从程序员视角在它的有关兼容性有SQL-质问可能被观看并且作为SQL语句编辑,并且SQL语句直接在巨视和VBA模里可以被使用操作进入桌子。用户可能混合并且使用两个VBA并且"宏"编程形式和逻辑既没提供面向对象的可能性。
导入导出报表的生成程序,当时有能力和到这项任务的复杂报告创造,没有另一受欢迎数据库报表程序的生成程序充满特色和强有力-水晶报告。MSDE(微软公司SQL服务器桌面发动机)2000,袖珍版本的MSSQL服务器2000,被包括开发版的办公室XP并且被用于进入可能作为除之外的另一种选择JET数据库引擎。(尽快的*版本的MSDE和微软公司交换服务器实际上使用这台喷气发动机处理巨大大量数据并且安置一“赝品”在它之上的那些应用的应用层。大约这事实的缺乏知识因进入/喷口家庭的软件产品而为不该受不敬做贡献,特别是关于"大"工程。)
进入分割和粘贴功能性能使它有用工具在其他数据库之间连结(例如,在数据或者数据库变换期间的Oracle和微软公司SQL服务器)。进入与给与窗子和其他平台应用一起的积分的各种各样进口和退场门特征一起来,一经请求从应用的里面或者手工由用户其中几可以被执行。例如非常紧密SNP完全格式化的为分享的形式与没有全部的进入软件的人们报告。它也能容易被升级到微软公司SQL服务器。
与一般的RDBMS完全不同,它缺乏数据库触发和预存程序。自从MS Access 2000 (Jet 4.0),开发人员可以在查询中设定参数,这跟预存程序很相似的,但这些“预存程序”只能处理一个程序.当资料表内数据发生变化时,它确实允许形式包含被引发的代码,使用是普通的透过查询和其他技术在进入营运储存的程序在方面RDBMS支援这些的。
[编辑本段]发展
进入可提供的编程语言,当时在另一个内产品Microsoft Office家具,微软公司应用的Visual Basic。两个数据库进入讯息库COM组成部分被提供:这笔遗产数据存取物体(DAO),用进入和新只可提供ActiveX数据对象(忙乱)。
MicrosoftAccess容易被应用于小的工程但是规模无效对大的工程如果应用被不好设计。
全部数据库质问,形式和报告被储存在数据库里,并且与相关的模型的理想协调,没有与他们做一个身体上组织的阶层的可能性。
一种设计技术是把进入应用在数据和计划之间进行分发。一数据库应该只包含桌子和关系,当另一个将有全部计划时,形式,报告和质问和对第一个数据库桌子的连接。令人遗憾,当连结时,进入允许没有有关的道路,因此那些发展环境作为这种生产环境有相同的道路应该(虽然你写你们自己的能"动态连接程序"常规在里VBA那搜出能一定背面结束档案以透过这个目录树搜寻,如果它发现这条电流通路它不能)。
这种技术也允许开发者在不同的档案中分申请,因此一些架构是可能的。
Access的优点
(1)存储方式单一
Access管理的对象有表、查询、窗体、报表、页、宏和模块,以上对象都存放在后缀为(.mdb)的数据库文件种,便于用户的操作和管理。
(2)面向对象
Access是一个面向对象的开发工具,利用面向对象的方式将数据库系统中的各种功能对象化,将数据库管理的各种功能封装在各类对象中。它将一个应用系统当作是由一系列对象组成的,对每个对象它都定义一组方法和属性,以定义该对象的行为和外国,用户还可以按需要给对象扩展方法和属性。通过对象的方法、属性完成数据库的操作和管理,极大地简化了用户的开发工作。同时,这种基于面向对象的开发方式,使得开发应用程序更为简便。
(3)界面友好、易操作
Access是一个可视化工具,是风格与Windows完全一样,用户想要生成对象并应用,只要使用鼠标进行拖放即可,非常直观方便。系统还提供了表生成器、查询生成器、报表设计器以及数据库向导、表向导、查询向导、窗体向导、报表向导等工具,使得操作简便,容易使用和掌握。
(4)集成环境、处理多种数据信息
Access基于Windows操作系统下的集成开发环境,该环境集成了各种向导和生成器工具,极大地提高了开发人员的工作效率,使得建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。
(5)Access支持ODBC(开发数据库互连,Open Data Base Connectivity),利用Access强大的DDE(动态数据交换)和OLE(对象的联接和嵌入)特性,可以在一个数据表中嵌入位图、声音、Excel表格、Word文档,还可以建立动态的数据库报表和窗体等。Access还可以将程序应用于网络,并与网络上的动态数据相联接。利用数据库访问页对象生成html文件,轻松构建Internet/Intranet的应用。
ACCESS的缺点
ACCESS是小型数据库,既然是小型就有他根本的局限性,以下几种情况下数据库基本上会吃不消:
1.数据库过大,一般ACCESS数据库达到50M左右的时候性能会急剧下降!
2.网站访问频繁,经常达到100人左右的在线。
3.记录数过多,一般记录数达到10万条左右的时候性能就会急剧下降!
C函数
函数名: access
功 能: 确定文件的访问权限
用 法: int access(const char *filename, int amode);
[编辑本段]access
Synopsis
#include <io.h>
int _access(const char *path,int mode) ;
Description
The access function, when used with files, determines whether the specified file exists and can be accessed as specified by the value of mode. When used with directories, _access determines only whether the specified directory exists; since under Windows all directories have read and write access.
The mode argument can be one of :
00 Existence only
02 Write permission
04 Read permission
06 Read and write permission
Returns
Zero if the file has the given mode, -1 if an error occurs.
Portability :
Windows. Under Unix a similar function exists too.
Note that lcc-win32 accepts both _access (Microsoft convention) and access.
程序例:
#include <stdio.h>
#include <io.h>
int file_exists(char *filename);
int main(void)
printf("Does NOTEXIST.FIL exist: %s\n",
file_exists("NOTEXISTS.FIL") ? "YES" : "NO");
return 0;
int file_exists(char *filename)
return (access(filename, 0) == 0);
Access数据库安全方式
一、密码式
给数据库起一个随机复杂的名称,避免被猜到被下载,这种方式在以前很流行,因为大家都对自己的代码很有自信。但随着错误提示对数据库地址的泄露导致数据库被非法下载,这种方式也就越来越少人用了。
二、"#"式
在数据库名称里加上#号,从URL上请求时#是请求地址和请求参数的一个分隔字符,如果知道了数据库名,直接请求的话,如:,WEB服务器会认为请求的是access而不是access#.mdb,所以会提示找不到文件,但是很遗憾,URL中对于这些特殊的字符都会有一个特殊的表示方式,#的特殊表示就是%23,如,那么access#.mdb将会被下载。还有如果用FlashGet之类的下载工具也可以直接下载。
三、ASP式
这种作法是比较专业但也是很安全的也是现在比较流行的作法,但是现在许多的人只是作了一半,只是将数据名改成ASP而以,这样的话直接用FlashGet之类的下载工具一样可以将数据库下载,这种方式的正确作法有两步:
第一步:在数据库内创建一个字段,名称随意,类型是OLE对象,内容设置为单字节型的"
这段代码运行完之后将会在数据库内生成一个nodownload表,表内字段是notdown。如果数据库内已有同名的数据表存在请将代码内的nodownload改成自己想要的数据表名即可。
四、asa式
这种方式的真谛是利用IIS对ASA文件的保护,从而使得数据库文件不能从URL上直接请求下载,但是这种方式被误解成只要将文件后缀改成ASA就可以了。要知道IIS只是对global.asa这个文件名有请求保护,所以这种方式只能将数据库名设置为global.asa,而且要注意的是,设置成global.asa之后最好不要将其放在主机或虚拟目录的根目录里,不然会被IIS当然正常的global.asa文件进行尝试运行的。
[编辑本段]Open Access的信息交流新模式
Open Access(简称OA)是在网络环境下发展起来的学术界传播信息及出版学术信息的一种新模式。它的兴起为信息的交流和利用方式产生重大影响,已经受到国际学术界、出版界、图书馆学界等的广泛关注。
Open Access通常被译作开放存取、开放获取,本文采用“开放存取”这一译法,主要是基于两个方面的考虑。一是“存取”相对于“获取”而言,不仅包括用户的“获取”,还包括作者的“存放”,所以用“存取”更能全面地覆盖OA的内涵;二是在图书馆学及情报科学领域,access一词译成“存取”已约定成俗。
目前被广泛接受的关于OA的定义源于布达佩斯开放存取倡议(Budapest Open Access Initiative,BOAI),即:OA意味着用户通过公共互联网可以免费阅读、下载、复制、传播、打印和检索论文的全文,或者对论文的全文进行链接、为论文建立索引、将论文作为素材编入软件,或者对论文进行任何其他出于合法目的的使用,而不受经济、法律和技术方面的任何限制,除非网络本身造成数据获取的障碍。对复制和传播的唯一约束,以及版权在此所起的唯一作用是,应该保证作者拥有保护其作品完整性的权利,并要求他人在使用作者的作品时以适当的方式表示致谢并注明引用出处。
推动开放存取运动的重要力量
开放存取符合作者同时也是读者的非赢利的信息传播动机和利用需求。在最近几年蓬勃兴起,主要的推动力量有:①政府部门和科研资助机构。一方面通过政策推动开放存取运动。近年来欧美一些国家政府和科研资助机构积极倡导由公共投资支持的科研成果应该为全社会所免费利用和共享,并通过制订政策来加以保障。如世界上最大的医学研究资助单位美国国立卫生院(National Institutes of Health,NIH) 的公共存取政策。另一方面提供资金支持。随着开放存取运动的发展,越来越多的政府部门、科研资助机构、基金会愿意为科研成果的开放存取提供资金支持。②学术科研人员。科学研究工作者是科研成果的创造者、评议者,同时还是科研成果的消费者。基于当前学术出版被商业出版者垄断,学术科研人员作为科研成果的创造者却不能自由享受科研成果的局面,科学家强烈呼吁要把学术出版的主导权和控制权夺回到科研人员手中。③大学。大学是开放存取运动的重要实践者和支持者。近年来一些知名大学纷纷推出了机构仓储,如加州大学、麻省理工、哈佛和斯坦福大学根据学校开放存取政策的要求,保存教员的研究成果,对公众免费开放并可在网络上获取。④图书馆。图书馆界是开放存取运动的积极参与者,通过成立推动开放运动的联盟、在网站上大力宣传开放资源、建立机构库等方式,致力于推动和创建服务于科学研究的基于网络环境的学术交流体系。⑤因特网。从技术的角度讲,开放存取一个重要的推动力量就是因特网。计算机和网络技术在出版领域中的应用,降低了在线出版和在线传播的总成本,使得开放存取成为有效又可行的学术出版和交流模式。
开放存取的主要影响
开放存取是一种学术交流方式的变革。开放存取的文献是数字化、在线、免费和几乎没有版权和授权的限制的,因此世界上每个人都有机会接触和共享研究成果,从而加快了学术信息传播速度,促进了科学研究的快速发展,提升了科学研究的公共利用程度。对于读者、作者、研究机构、图书馆和出版单位有不同的影响。
①对作者而言,读者群得到拓展,扩大了学术成果传播的范围,增加了学术成果参与交流和被引用的机会,提高了成果的影响力和显示度。②对读者而言,无须面对合理使用的争议或可能侵权的担忧,可以方便快捷地免费获取同行的研究成果,同时也提高了获得资料的时效性。③对于研究机构而言,一方面随着机构学术成果的广泛传播,彰显了机构的科研实力,提高了机构的知名度。另一方面作为学术成果的利用者,减少了费用支出,避免了为出版学术成果和获取学术成果的重复付费。④对于资助机构而言,他们资助的研究工作更加公开,影响更大,科研成果得到了更广泛的传播,使得投资产生了更大的社会效益。⑤对图书馆而言,一定程度上缓解了图书馆的经费紧张,收集和整理网上的开放存取资源,扩充数字馆藏,增强了图书馆的信息保障能力。另外也分流了图书馆用户,弱化了图书馆信息中介的作用。⑥对出版商而言,OA是一种挑战,一方面扩大了期刊论文的使用率和影响力,直接效果是提高了论文的被引频次;另一方面一定程度上影响了发行量和优质稿源,降低了利润和缩小了市场风份额。
开放存取存在的主要问题
开放存取运动虽然已经蓬勃发展,但在运作经费、质量控制、知识产权等方面存在着不成熟性。①运作经费问题。开放存取期刊、开放存取仓储的运作是需要成本的,包括审稿费用、硬件投入、资源维护等。目前尚未建立起合理有效的经费支持模式,主要有作者付费、科研机构付费、各类资助等方式,经济运行机制是最为核心的问题。②知识产权保护问题。作为一种网络出版模式,知识产权的表现形式是什么,如何指定相应的管理策略,如何保护产权人利益,如何控制读者与作者之间的权益平衡等问题都急待解决。③质量控制问题。开放存取仓储应缺少同行审稿,意味着没有衡量论文质量的客观方法,只有读者自己对内容进行评估,可能使那些已处于知识系统顶端者受益。如哈佛大学的开放存取网站可能因其世界一流的美名而吸引读者,而发展中国家某所不知名的学校或毫无名气的学者所发表的论文有可能就不那么受关注。如何制定质量控制策略,特别是如何建立行之有效的、跨机构的评审联盟制度尤为重要。④技术方面的问题。将先进的技术应用于开放存取,有助于用户更好的访问免费资源。因此如何建立全球化的联邦信息组织与服务体系结构、动态的数字对象管理体系等问题是开放存取可持续发展的重要保证。
开放存取作为一种学术出版与信息交流的新模式,其本质是自由、平等、公正地、无障碍地获得学术信息。开放存取运动的蓬勃开展,使开放存取资源越来越多,其数量、质量和学术影响力日益增强,相关问题的解决也在实践中不断探索和研究。随着“知识共享就是力量”的理念的日益张扬,开放存取运动会集聚越来越多的关注和支持。[
本回答被提问者采纳
Mysql 表与表之间的关系
一、前言
二、表与表之间的关系
(一) 一对多
(二) 一对一
(三) 多对多
一、前言
研究表与表之间的关系前,先要知道将所有数据存放在一张表中的弊端:
1.结构不清晰 ---> 不致命
2.浪费空间 ---> 不致命
3.可扩展性极差 ---> 不可忽视的弊端
就i好比将所有的代码存放在一个文件中,强耦合到了一起,而我们需要做的就是 ----> 解耦合 ----> 拆分表
拆分表解决以上问题.
需要给两张表之间,建立一种强有力的关系, 使用 “外键”。
foreign key(外键): 用来建立两张表之间的关系
- 一对多
- 多对多
- 一对一
foreign key(外键)语法:
foreign key(当前表中建立关系的外键字段) references 被关联表名(id)
二、表与表之间的关系
(一) 一对多
一对多(左边表的多条记录对应右边表的唯一一条记录)
注意:必须先建立被关联表,再建立关联表
例如:定义一张员工部门表
id,name,gender,dep_name
注意: 要确定两张表之间的关系,必须站在两个位置去思考:是否是单向多对一还是双向多对一,还是一一对应的关系。
站在员工表的位置:多个员工能否对应一个部门?(能)
员工与部门:多对一(员工表单向 多对一 部门表)站在部门表的位置:多个部门能否对应一个员工?(不能)
总结:凡是单向 多对一的表关系,称之为 一对多 的外键关系,如下图所示
创建两张表:
#被关联表:
dep:
create table dep(
id int primary key auto_increment,
dep_name varchar(16),
dep_desc varchar(255));
#关联表:
emp:
create table emp(
id int primary key auto_increment,
name varchar(6),
age int,
gender enum('male','female'),
dep_id int not null,
foreign key(dep_id) references dep(id));
#插入数据:必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。
#插入dep的数据:
insert into dep(dep_name,dep_desc) values(
'nb_外交部', '国际形象大使部门'),
('sb_教学部', '造程序员部门!!!!'),
('技术部', '技术有限部门');
#插入emp的数据:
insert into emp(name, age, gender, dep_id)
values('tank', 17, 'male', 1),
('jason', 70, 'male', 2),
('sean', 50, 'male', 2),
('egon', 88, 'male', 2),
('owen', 95, 'female', 3);
# 报错
insert into emp(name, age, gender, dep_id) values(
'baohan', 18, 'others', 999);
更新数据:
update emp set dep_id=100 where id=2; #报错
update dep set id=100 where id=1; #报错
# 要先删除已关联的dep_id字段,才能修改dep表中的关联id字段。
delete from emp where id=1;
update dep set id=100 where id=1;
mysql> select * from emp;
+----+-------+------+--------+--------+
| id | name | age | gender | dep_id |
+----+-------+------+--------+--------+
| 2 | jason | 70 | male | 2 |
| 3 | sean | 50 | male | 2 |
| 4 | egon | 88 | male | 2 |
| 5 | owen | 95 | female | 3 |
+----+-------+------+--------+--------+
mysql> select * from dep;
+-----+--------------+--------------------------+
| id | dep_name | dep_desc |
+-----+--------------+--------------------------+
| 2 | sb_教学部 | 造程序员部门!!!! |
| 3 | 技术部 | 技术有限部门 |
| 100 | nb_外交部 | 国际形象大使部门 |
+-----+--------------+--------------------------+
删除:先删除关联表中的记录,再删除被关联表中的记录
#先删除emp表中的dep_id为2的记录
delete from emp where dep_id=2;
#再删除dep表中id为2的记录
delete from dep where id=2;
mysql> select * from emp;
+----+------+------+--------+--------+
| id | name | age | gender | dep_id |
+----+------+------+--------+--------+
| 5 | owen | 95 | female | 3 |
+----+------+------+--------+--------+
mysql> select * from dep;
+-----+--------------+--------------------------+
| id | dep_name | dep_desc |
+-----+--------------+--------------------------+
| 3 | 技术部 | 技术有限部门 |
| 100 | nb_外交部 | 国际形象大使部门 |
+-----+--------------+--------------------------+
级联更新与级联删除
- on update cascade 级联更新
- on delete cascade 级联删除
意思是 当更新或删除主键表时,那么外键表也会跟随一起更新或删除
再以上述例子为例:
创建两张表:
#被关联表:
dep:
create table dep(
id int primary key auto_increment,
dep_name varchar(16),
dep_desc varchar(255));
#关联表:
emp:
create table emp(
id int primary key auto_increment,
name varchar(6),
age int,
gender enum('male', 'female'),
dep_id int not null,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
#插入数据:必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。
#插入dep的数据:
insert into dep(dep_name,dep_desc) values(
'nb_外交部', '国际形象大使部门'),
('sb_教学部', '造程序员部门!!!!'),
('技术部', '技术有限部门');
#插入emp的数据:
insert into emp(name, age, gender, dep_id)
values('tank', 17, 'male', 1),
('jason', 70, 'male', 2),
('sean', 50, 'male', 2),
('egon', 88, 'male', 2),
('owen', 95, 'female', 3);
更新数据或删除数据:
#更新记录:
update dep set id=200 where id=1;
mysql> select * from dep;
+-----+--------------+--------------------------+
| id | dep_name | dep_desc |
+-----+--------------+--------------------------+
| 2 | sb_教学部 | 造程序员部门!!!! |
| 3 | 技术部 | 技术有限部门 |
| 200 | nb_外交部 | 国际形象大使部门 |
+-----+--------------+--------------------------+
#删除记录
delete from dep where id=200;
mysql> select * from dep;
+----+--------------+------------------------+
| id | dep_name | dep_desc |
+----+--------------+------------------------+
| 2 | sb_教学部 | 造程序员部门!!!! |
| 3 | 技术部 | 技术有限部门 |
+----+--------------+------------------------+
(二) 一对一
一对一:两张之间的关系 一一对应,将一张数据量比较大的表,拆分成两张表。
例如:数据量比较大的用户表
- 用户表:多个用户 能否 对应 一个用户详情信息? 不能
- 用户详情表:多个用户详情信息 能否 对应 一个用户? 不能
两张表之间都没有多对一的关系,就是“一对一”的外键关系。
总表:user_info
id, name, age, gender, hobby, id_card分表:user:
id , name, age, detail_id(外键)分表:detail:
id, gender, hobby, id_card
注意:1、user与detail表建立了 一对一的外键 关系。
2、foreign key 应该建在 使用频率较高的一方。
创建表:
#被关联表
detail
create table detail(
id int primary key auto_increment,
gender enum('male', 'female'),
hobby varchar(32),
id_card char(18)
);
#关联表
user
create table user(
id int primary key auto_increment,
name varchar(6),
age int,
detail_id int unique,
foreign key(detail_id) references detail(id)
on update cascade
on delete cascade
);
#插入数据
insert into detail(gender, hobby,id_card) values
('male','play ball',9527),
('female','rap',909),
('female','吃鸡',101),
('female','被吃鸡',404),
('female','HSNM',500
);
insert into user(name,age,detail_id) values
('tank', 17,3),
('egon', 77,5),
('jason', 87,1),
('sean', 97,2),
('owen', 107,4);
# 报错,一对一,关系必须 一一对应
insert into user(name,age,detail_id) values ('baohan',19,3);
mysql> select * from user;
+----+-------+------+-----------+
| id | name | age | detail_id |
+----+-------+------+-----------+
| 1 | tank | 17 | 3 |
| 2 | egon | 77 | 5 |
| 3 | jason | 87 | 1 |
| 4 | sean | 97 | 2 |
| 5 | owen | 107 | 4 |
+----+-------+------+-----------+
mysql> select * from detail;
+----+--------+-----------+---------+
| id | gender | hobby | id_card |
+----+--------+-----------+---------+
| 1 | male | play ball | 9527 |
| 2 | female | rap | 909 |
| 3 | female | 吃鸡 | 101 |
| 4 | female | 被吃鸡 | 404 |
| 5 | female | HSNM | 500 |
+----+--------+-----------+---------+
(三) 多对多
多对多:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即 多对多的外键关系
关联方式:foreign key + 一张新的表
要把book_id和author_id设置成唯一
- 多对多:
也必须站在两张表的位置去思考;
- 错误示范:
- 创建book表
create table book(
id int primary key auto_increment,
title varchar(20),
price int,
book_content varchar(255),
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
- 创建author表
create table author(
id int primary key auto_increment,
name varchar(16),
age int,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
- 问题: 无法知道哪张表是被关联表
正确示范:
- 利用第三张表,为两张表建立“多对多外键关系”。
book:
create table book(
id int primary key auto_increment,
title varchar(20),
price int,
book_content varchar(255));
author:
create table author(
id int primary key auto_increment,
name varchar(16),
age int);
book2author:
create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
#插入数据
- book
insert into book(title, price, book_content) values
('金瓶mei', 199, '讲述朦胧时光的小故事'),
('python从入门到断气', 2000, '学习如何一夜秃头'),
('三体', 200, '跟着大佬进入宇宙奇幻世界');
- author
insert into author(name, age) values
('egon', 68),
('jason', 88);
- book2author:
insert into book2author(book_id, author_id) values
(1, 1),
(1, 2),
(2, 2),
(3, 1);
# 报错, 插入的数据,book_id, author_id必须存在
insert into book2author(book_id, author_id) values (4, 4);
# 更新或删除
# 更新
- update book set price=6666 where id=1;
- update book set id=4 where id=1;
# 删除
- delete from book where id=4;
以上是关于如何构建一个完善的数据库,如何来处理表与表关系.的主要内容,如果未能解决你的问题,请参考以下文章