数据库主从表、关系;主、外键关系和作用

从数据库是主数据库的备份,当主数据库变化时从数据库要更新,这些数据库软件可以设计更新周期。这是提高信息安全的手段。主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。
主外键的关系结构:
1,一对一,不用引用主外键,把它们放一个表中即可
例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中即可
2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键的外键。
例如:一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系;
3,多对多关系,需要创建一个表,表中需要两个字段,分别是引用,两个多对多字段主键的外键。
     例如:
学生表(学号,姓名,…………)主键:学号
课程表(课程号,课程名,…………)主键:课程号
一个学生能选多门课,一个课可以由多个学生选,即是多对多关系,
那么成绩表就是它们之间关系的体,
即引用成绩表(学号,课程号,成绩)。这里学号和课程号,分别是学生表和课程表中学号和课程号的外键
在我们现在这个阶段中,主要还是使用,主外键间的一对多的关系
主键Primary key,唯一标示一个实体。是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一。
外键Foreign,是用来使表与表之间联系。用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空。
外键的作用:
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

一、什么是主键、外键
关系型数据库中的一条记录中有若干个属性若其中某一个属性组(注意是
组)能唯一标识一条记录该属性组就可以成为一个主键
比如
学生表(学号姓名性别班级)
其中每个学生的学号是唯一的学号就是一个主键
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就是一个主键
成绩表(学号,课程号,成绩)
成绩表中单一一个属性无法唯一标识一条记录学号和课程号的组合才可
以唯一标识一条记录所以学号和课程号的属性组是一个主键
成绩表中的学号不是成绩表的主键但它和学生表中的学号相对应并且
学生表中的学号是学生表的主键则称成绩表中的学号是学生表的外键
同理成绩表中的课程号是课程表的外键
定义主键和外键主要是为了维护关系数据库的完整性总结一下
1.主键是能确定一条记录的唯一标识比如一条记录包括身份正号姓
名年龄。
身份证号是唯一能确定你这个人的其他都可能有重复所以身份证号
是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段用于保持
数据的一致性。
比如A表中的一个字段是B表的主键那他就可以是A表的外键。
二、主键、外键和索引的区别
主键、外键和索引的区别?
主键外键索引
定义唯一标识一条记录不能有重复的不允许为空表的外键是另一表
的主键,外键可以有重复的,可以是空值该字段没有重复值但可以有一个空值
作用用来保证数据完整性用来和其他表建立联系用的是提高查询排序的
速度
个数主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引
聚集索引和非聚集索引的区别?
聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。
聚集索引在索引页里直接存放数据而非聚集索引在索引页里存放的是
索引这些索引指向专门的数据页的数据。
三、数据库中主键和外键的设计原则
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外
键的设计对物理数据库的性能和可用性都有着决定性的影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和
外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环
境就很难对这些键进行修改所以在开发阶段就设计好主键和外键就是非常
必要和值得的。
主键
系数据库依赖于主键---它是数据库物理模式的基石。
主键在物理层面上只有两个用途
1.惟一地标识一行。
2.作为一个可以被外键有效引用的对象。
基于以上这两个用途下面给出了我在设计物理层面的主键时所遵循的一
些原则
1.主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的
连接表中的数据并抱怨它没有什么用处那就证明它的主键设计地很好。
2.主键应该是单列的以便提高连接和筛选操作的效率。
注使用复合键的人通常有两个理由为自己开脱而这两个理由都是错误
的。其一是主键应当具有实际意义然而让主键具有意义只不过是给人为地
破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表
中使用两个外部键来作为主键我也反对这种做法理由是复合主键常常导
致不良的外键即当连接表成为另一个从表的主表而依据上面的第二种方法
成为这个表主键的一部分然这个表又有可能再成为其它从表的主表其主
键又有可能成了其它从表主键的一部分如此传递下去越靠后的从表其主
键将会包含越多的列了。
3.永远也不要更新主键。实际上因为主键除了惟一地标识一行之外再
没有其他的用途了所以也就没有理由去对它更新。如果主键需要更新则说
明主键应对用户无意义的原则被违反了。
注这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整
理的数据并不适用。
4.主键不应包含动态变化的数据如时间戳、创建时间列、修改时间列等。
5.主键应当有计算机自动生成。如果由人来对主键的创建进行干预就会
使它带有除了惟一标识一行以外的意义。一旦越过这个界限就可能产生认为
修改主键的动机这样这种系统用来链接记录行、管理记录行的关键手段就
会落入不了解数据库设计的人的手中。
四、数据库主键选取策略
我们在建立数据库的时候需要为每张表指定一个主键所谓主键就是能
够唯一标识表中某一行的属性或属性组一个表只能有一个主键但可以有多
个候选索引。因为主键可以唯一标识某一行记录所以可以确保执行数据更新、
删除的时候不会出现张冠李戴的错误。当然其它字段可以辅助我们在执行这
些操作时消除共享冲突不过就不在这里讨论了。主键除了上述作用外常常
与外键构成参照完整性约束防止出现数据不一致。所以数据库在设计时主
键起到了很重要的作用。
常见的数据库主键选取方式有
·自动增长字段

很多数据库设计者喜欢使用自动增长型字段因为它使用简单。自动增长
型字段允许我们在向数据库添加数据时不考虑主键的取值记录插入后数
据库系统会自动为其分配一个值确保绝对不会出现重复。如果使用SQL
Server数据库的话我们还可以在记录插入后使用@IDENTITY全局变量获取系
统分配的主键键值。

·手动增长字段
·UniqueIdentifier
·"COMB(Combine)"类型

时间: 2024-10-19 16:40:30

数据库主从表、关系;主、外键关系和作用的相关文章

SQL SERVER中获取表间主外键关系

sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OBJECT_NAME(con.constid) '关系名' ,OBJECT_NAME(sf.fkeyid) '主键表' ,fcol.name '主键' ,OBJECT_NAME(sf.rkeyid) '外键表' ,rcol.name '外键',st.name'数据类型'FROM sysforeignk

PostgreSql查看当前表的主外键关系

PostgreSql查看当前表被哪些引用作参考表 -- pg_CONSTRAINT.contype : p(主键), f(外键), u(唯一), c(检查)-- 查看当前表IDSELECT oid, relname FROM pg_class WHERE relname = 'syslogfilter';-- 查看引用当前表ID作参考表的主外键约束信息SELECT * FROM pg_CONSTRAINT WHERE confrelid = '24935';-- 查看那些外键的名称SELECT

关于表的主外键关系练习 师生 分数表

--创建三个表 --表一:学生表 student--学号:code int (主键)从1开始--姓名:name varchar(50)--性别:sex char(10)--班级:banji char(10)--语文教师编号:yujiao int --数学教师编号:yujiao int --英语教师编号:yujiao int --表二:教师表 teacher--教师名字:name --教师编号:code int (主键) 从1001开始--负责课程:lesson char(10)(语文.数学.英语

数据库几张表有主外键关系怎么删除

1. trigger ,数据库触发器操作.在数据库完成,先删子表后删主表,连接数据库次数太多,性能估计不太好. 2. 级联删除 在创建表时定义,如下所示的b表: create table a ( id varchar(20) primary key, password varchar(20) not null ) create table b ( id int identity(1,1) primary key, name varchar(50) not null, userId varchar

SQL Server数据库中导入导出数据及结构时主外键关系的处理

2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致部分数据无法导入. 情景一.同一数据库产品,相同版本 此种情况下源数据库与目标数据库的数据结构与数据的导入导出非常简单. 方法1:备份源数据库,恢复到目标数据库即完成. 方法2:使用SQL Sever数据库自带的[复制数据库]功能或者[导入数据]功能按照向导操作即可. 情景二.同一数据库产品,不同版

Hinernate进行mysql数据库的逆向工程无法生成主外键关系

(1)我们在进行SSH开发大※的项目的时候,使用myeclipse自带的hibernate的逆向工程工具时,发现竟然无法生成one-to-one  one-to-many等的主外键关系,明明的数据库建时已经有主外键关系了.为啥逆向生成时就不行了呢? (2)首先说一下,我使用的是PHP开发环境Appserv自带的MySQL数据库,不是单独安装的: (3)这是因为数据库引擎的问题, 我们可以在sql命令行中输入命令:show engines; 可以看到default默认的是MyISAM: (3)"M

MySQL创建数据表并建立主外键关系

为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引,如果外键列不存在索引,mysql将自动创建索引. 一.SQL语句创建数据表并设置主外键关系 create table demo.ChineseCharInfo ( ID int not null auto_increment, Hanzi varchar(10) not null, primary

Entity Framework Code First主外键关系映射约定

本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个不同表之间可以存在外键依赖关系,一个表自身也可以有自反关系(表中的一个字段引用主键,从而也是外键字段). Entity Framework Code First默认多重关系的一些约定规则: 一对多关系:两个类中分别包含一个引用和一个集合属性,也可以是一个类包含另一个类的引用属性,或一个类包含另一个类

Sql Server有主外键关系时添加、删除数据

当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTER TABLE ' + O.NAME + ' NOCHECK CONSTRAINT [' + F.NAME + '];' AS COMMAND FROM SYS.FOREIGN_KEYS F INNER JOIN SYS.ALL_OBJECTS O ON F.PARENT_OBJECT_ID = O

Python3-sqlalchemy-orm 联表查询-无外键关系

#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import create_engine,func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String,DATE from sqlalchemy.orm import session