文档库 最新最全的文档下载
当前位置:文档库 › 数据库中主键与外键的理解

数据库中主键与外键的理解

数据库中主键与外键的理解

数据库中主键与外键的理解

在关系型数据库中,数据结构有逻辑结构和物理结构。物理结构指存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表中的一列即为一个字段(属性),代表的是实体的一个属性。表中的一行即为一条记录。如:学生表中(学号,姓名,年龄,性别),在该表中有4个字段,代表学生实体的4个属性。表中的一行数据(001,张三,男,20),即一条记录,表示的是张三这个学生的信息。

在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(主码),而主键包含的属性(字段)叫做主属性,其他的则为非主属性。在这里说明一下,既然是“字段集”,那么主键就可能是一个字段或者多个字段。例如上面的学生表,用下划线表示的学号,就是能唯一标识一个学生的字段,学号字段就是该表的主键。由于学生的姓名重名是不可避免的,所以一般不用姓名来作为唯一标识一个学生的主键。

再举个例子说明一下多个字段作为主键。例如学生选课表(学号,课程号,成绩),在学生选课表中,主关键字是(学号,课程号)。原因显而易见,一个学生可以选择多门课程,一个课程可以被多个学生选择。如果单单是用学号或者课程号,都不足以唯一标识一条记录。

对于外键的理解,在这里我也举个例子。假设有两个表,学生表(学号,姓名,年龄,性别,专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表中主键是学号,专业信息表中主键是专业编号。学生表中的非主属性专业编号恰好是专业信息表中的主键。我们就称这个专业编号是学生表的外键。像这样,一个表的非主属性是另一个表的主属性,该非主属性就是外键。

数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。

1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。

2.参照完整性约束,即外键的约束,某一外键的值必须在它引用的主键字段中存在。如,学生表中专业编号属性的值,必须都存于专业信息表中的专业编号属性中。想一想也就明白了,一个学生(大学生)怎么可能属于一个不存在的专业。

3.用户自定义完整性约束,指的是一些用户自己设定的约束,例如字段是否可以为空,字段值的取值范围(如:人的性别只能取男、女)。

数据库主键和外键的作用

数据库主键和外键的作用 首先介绍一下什么是主键、什么是外键。 1 什么是主键外键 学生表(学号,姓名,性别,班级) ? 学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的是控制存储在外键表中的数据 3 主键的设计原则 1)主键应当是对用户没有意义的 2)主键应该是单列的,以提高连接和筛选操作的效率 复合键的使用通常出于两点考虑: a)主键应当具有意义-----这为认为的破坏数据库提供了方便 b)在描述多对多关系的连接表中可以使用两个外部键作为主键------该表可能成为其他从表的主表,并成为从表的主键的一部分,使得之后的从表包含更多的列 3)永远不要更新主键 4)主键不应该包含动态变化的数据(时间戳等) 5)主键应当由计算机自动生成 4 数据库主键选取策略 建立数据库的时候,需要为每张表指定一个主键(一个表只能有一个主键,但是可以有多个候选索引) 常见的主键选取方式有: 1)自动增长型字段 自动增长型主键会省略很多繁琐的工作,但在数据缓冲模式下,不能预先填写主键与外键的值 Order(OrderID,OrderDate)? //主键OrderID是自动增长型字段 OrderDetail(OrderID,LineNum,ProductID,Price)

数据库中主键与外键的理解

数据库中主键与外键的理解 在关系型数据库中,数据结构有逻辑结构和物理结构。物理结构指存储在物理介质上的数据文件的结构。逻辑结构即关系,也就是一张张的二维表。表中的一列即为一个字段(属性),代表的是实体的一个属性。表中的一行即为一条记录。如:学生表中(学号,姓名,年龄,性别),在该表中有4个字段,代表学生实体的4个属性。表中的一行数据(001,张三,男,20),即一条记录,表示的是张三这个学生的信息。 在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(主码),而主键包含的属性(字段)叫做主属性,其他的则为非主属性。 在这里说明一下,既然是“字段集”,那么主键就可能是一个字段或者多个字段。例如上面的学生表,用下划线表示的学号,就是能唯一标识一个学生的字段,学号字段就是该表的主键。由于学生的姓名重名是不可避免的,所以一般不用姓名来作为唯一标识一个学生的主键。再举个例子说明一下多个字段作为主键。例如学生选课表(学号,课程号,成绩),在学生选课表中,主关键字是(学号,课程号)。原因显而易见,一个学生可以选择多门课程,一个课程可以被多个学生选择。如果单单是用学号或者课程号,都不足以唯一标识一条记录。对于外键的理解,在这里我也举个例子。假设有两个表,学生表(学号,姓名,年龄,性别,专业编号),专业信息表(专业编号,专业名称,专业备注信息)。学生表中主键是学号,专业信息表中主键是专业编号。学生表中的非主属性专业编号恰好是专业信息表中的主键。我们就称这个专业编号是学生表的外键。像这样,一个表的非主属性是另一个表的主属性,该非主属性就是外键。 数据库的约束有三种,实体完整性约束、参照完整性约束和用户自定义约束。 1.实体完整性约束指的是主键不能为空,如果主键为空了还怎么唯一标识一条记录。

经典SQL语句大全_主外键_约束

一、基础(建表、建约束、关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。 (最后几页介绍SQL基础约束) 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) --建表、建约束、关系 create table tableok ( col1 int, col2_notnull int not null, col3_default nchar(1) not null default('男'), --默认男 col4_default datetime not null default(getdate()), --默认得到系统时间 col5_check int not null check(col5_check>=18 and col5_check<= 55),--添加约束,数据值在18到55之间 col6_check nchar(9) not null check(col6_check like 'msd0902[0-9][^ 6-9]'), --添加约束,数据值前7位必须是‘msd0902’,倒数第两位可以是0-9中任意一个数字,最后一位不是6-9之间的数字。 cola_primary nchar(5) not null primary key, --建立主键 colb_unique int unique, --唯一约束 col7_Identity int not null identity(100,1), --自增长,从100开始,每列值增加1个

语句注主键与外键的定义子句)(精)

一、建表(create table 语句。注:主键与外键的定义子句) create table student ( student_id char(6) not null primary key, student_name varchar(20) not null, class varchar(16) , sex tinyint , birthday datetime , credit tinyint , notes varchar(50) ) create table course ( course_id char(3) primary key, course_name varchar(16) , term tinyint , course_time tinyint , credit tinyint ) create table result ( student_id char(6) , course_id char(3) , grade tinyint , credit tinyint , constraint pk_result primary key (student_id,course_id), Constraint fk_result foreign key (course_id) references course (course_id) ) 二、修改表结构(alter table, drop table语句) 1.在表XS中增加1个新列——奖学金等级 ALTER TABLE XS ADD 奖学金等级tinyint NULL 2.在表XS中删除名为奖学金等级的列 ALTER TABLE XS DROP COLUMN 奖学金等级 3.修改表XS中已有列的属性 ALTER TABLE XS ALTER COLUMN 姓名char(10) 4.删除表XS DROP TABLE XS 三、修改表数据(insert,delete,update语句)

SQL的主键和外键的作用

SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识 一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学 生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证 号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如, A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用:

数据库作业第三章

第三章关系数据库系统RDBS作业 一. 简答题 1.对于表中几个特殊的列,如主键、候选键和外键,分别用什么限制来保证它们的完整性?对 表中其它一般性的列,用什么限制来保证它们的完整性? 主键约束:主要是针对主键,以保证主键值的完整性。要求主键值必须满足值唯一、不能为空值。 唯一约束:主要是针对候选键,以保证主键值的完整性。要求候选键必须满足值唯一、可有一个且仅有一个空值。 外键约束:是维护表与表之间外键所对应属性(组)数据的一致性。主表到从表,表示主表中的主键值在修改和删除时,从表中与该主键值相同的外键值可级联(CASCADE)修改和删除,或改为空值(SET NULL)或默认值(SET DEFAULT),或禁止(NO ACTION)主表主键值的修改和删除;从表到主表,表示从表中的外键值在插入和修改时,其值应参照(REFERENCE)主表中的主键值。 对于其他一般性的列,还有检查约束和断言。 2.SQL SERVER中规则的目的? RULE主要是针对表中的某一列,指明该列的取值范围。 3.SQL SERVER中在定义某些限制时,分列级与表级,其分类的原则是什么? 列级检查约束针对表中一列,表级检查约束则针对同一表中多列。 4.外键限制定义的条件? 在含外键的表上定义; 定义外键限制的列必须是另一个表中的主键。 5.请说明在维护表间数据完整时外键限制与触发器的异同。 1.错误信息的管理上:约束与触发器在遇到问题时都可以返回给用户一定的错误信息。但是,触发器可以返回数据库管理员自定义的错误信息,而且还可以实现较为复杂的逻辑控制,而约束只能够通过标准化的系统错误信息来传递错误消息; 2.性能上的差异分析:从性能上来说,约束的执行性能都要高一点。虽然约束的执行性能比较高,但是其向用户提供的错误信息确实非常有限的。 3.管理维护的工作量:由于约束基本上都是数据库现成的解决方案。无论是索引约束还是外键约束,又或者是check约束。往往在数据库系统中已经有了现成的解决方案。数据库管理员通过直接引用这些解决方案即可以实现特定的功能,而不用再费力的编写触发器来实现。而触发器中系统没有现成的可以引用,而都需要数据库管理员通过实际清理来进行编写。 6.关系代数的基本操作符?笛卡尔乘积最大的作用是什么? 关系代数的基本操作符:SELECTION(选择)、PROJECTION(投影)、UNION(并或称联合)、INTERSECTION(交)、DIFFERENCE(差)、CROSS-PRODUCT(积)。 笛卡尔操作的最大作用是把任意两个不相关的表联接起来。 7.为什么说在实际查询中自然连接是用得比较多的? 自然连接可以从两个关系实例的笛卡尔乘积中选出同时满足一个或多个条件等式的行,每个条件等式中的列名相同。同时,在结果模式中重复的字段只有一个。 8.关系代数中对结果有重复元组时,如何处理? 对关系代数中对结果有重复元组时,将去掉重复元组。 9.连接的分类?

SQL Server外键设置笔记

SQL的主键和外键约束 SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 索引--是提高查询排序的速度 个数: 主键--主键只能有一个 外键--一个表可以有多个外键 索引--一个表可以有多个唯一索引 创建SQL的主键和外键约束的方法: create table Student --建表格式:create table 自定义的表名 ( --字段名一般为有一定意义的英文 StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int, --int型的后面不需要接长度

修改主键和外键

SQL中,一般要修改或者删除主键,只需要一个简单的命令即可:alter table 表名drop primary key. 下面我举例说明 先建一个表:table_project Create table table_project(‘id’ varchar(10),’name’ varchar(10),rmimary(‘name’)) Engine=myisam default charest=gb2312; 这时表已经建好,然后继续录入几个数据,等数据录入完成,此表格已经生成,如果这时你发现主键错了,想再改变主键就没那么简单了,因为你只是表格的结构错了,数据并没有错误,如果这时再删除表格重新建,无疑是在自寻苦恼。这时,其他只要两个命令就能完成。 1.先删除主键 Alter table table_project drop primary key 2.增加主键 Alter table table_project add primary key(id) 这就是如何不改变表内数据,修改主键的方法! 语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名); 例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id) //FK_ID是外键的名称 /* CREATE TABLE `tb_active` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `user_id_2` (`user_id`), CONSTRAINT `FK_ID` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 */ 删除外键 语法: ALTER TABLE table-name DROP FOREIGN KEY key-id; 例: ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`

SQL中的主键和外键

主键与外键 一、什么是主键、外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以学号和课程号的属性组是一个主键 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键 同理成绩表中的课程号是课程表的外键 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。二、主键、外键和索引的区别收藏 聚集索引和非聚集索引的区别? 聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。

在sql server2008数据库中创建主外键

设置主、外键的方法 1、主键的设置 (1)设置gl22class表的主键 如图1所示。在gl22class表名上单击右键,选择设计命令,如A 处所示。打开右边的窗口,用鼠标单击要设置的关键字class_id的最左边箭头,如B处所示。最后单击主键,如C处所示。 A 图1 如果设置成功,如图2中A处所示。最后单击保存按钮。如B处所示。

图2 (2)设置gl22course 表的主键 和(1)设置class 表的主键的方法是一样的。Course 表的关键字是course_id 。最后单击保存按钮。 (3)设置gl22department 表的主键 和(1)设置class 表的主键的方法是一样的。department 表的关键字是dept_id 。最后单击保存按钮。 (4)设置gl22student 表的主键 和(1)设置class 表的主键的方法是一样的。student 表的关键字是student_id 。最后单击保存按钮。 (5)设置gl22grade 表的主键 和(1)设置class 表的主键的方法是一样的。grade 表的关键字是student_id 和course_id 。这两个属性要同时设置,设置方法是:按下shift 键,用鼠标单击A 处和B 处。同时选中后,单击C 处。最后 单

击保存按钮。 图3 2、外键的设置 (1)gl22class表和gl22department表设置外键 如图4所示。在gl22class表上单击右键选择设计命令。打开右边 A处所示。打开如图5所示的窗口。

图4 在图5中单击添加按钮,用鼠标单击表和列规范,出现A处的按钮,单击A处按钮,打开如图6所示的窗口。 图5

数据库主键外键设计原则 sky-v 博客园

数据库主键外键设计原则- sky-v - 博客园 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱, 而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注:这项原则对于那些经常需要在数据转换或多数 据库合并时进行数据整理的数据并不适用。 4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就

数据库主键与外键

聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。 注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。 4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。 四、数据库主键选取策略 我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一

主键,外键等约束详解实例

1、--创建表 create table tb_Dept ( Deptid char(2)Primary key, DeptName char(16)Not Null ) 2、--外键约束 create table tb_Student ( Studid char(10)Primary key, Studname char(8)Not null, Deptid char(2)Not null, Constraint FK_DeptID Foreign Key(Deptid) References Tb_Dept(DeptID) ) 3、--外键约束简化形式,必须要求tb_Dept表中DeptID为主键,且数值类型相同create table Tb_Student ( StudId char(10)Primary key, StudName char(8)Not null, DeptID char(2)not null References Tb_Dept ) 4、--创建表,无主键 create table Tb_Class ( ClassID char(8)not null, ClassName varchar(30)not null, DeptId char(2)not null, ClassStuNumber int ) 5、--创建表,同时定义主键 create table Tb_Class ( classid char(8)not null, ClassName varchar(30)not null, DeptID char(2)not null, ClassStuNumber int constraint PK_ClassID Primary key (ClassID,ClassName) ) 6、--新增主键 Alter table Tb_class ADD Constraint PK_ClassID primary key(Classid) 7、--删除主键 Alter table tb_Class Delete Constraint PK_ClassID Primary key(ClassID) 8、--外键级联更新,删除,简化形式 Create table tb_student (

关于数据库主键和外键

关于数据库主键和外键 一、什么是主键、外键 关系型数据库中的一条记录中有若干个属性 若其中某一个属性组(注意是组)能唯一标识一条记录 该属性组就可以成为一个主键 比如 学生表(学号 姓名 性别 班级) ,其中每个学生的学号是唯一的,学号就是一个主键,课程表(课程编号,课程名,学分) 。其中课程编号是唯一的,课程编号就是一个主键。成绩表(学号,课程号,成绩) 。 成绩表中单一一个属性无法唯一标识一条记录 学号和课程号的组合才可以唯一标识一条记录 所以学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键 但它和学生表中的学号相对应。并且学生表中的学号是学生表的主键 则称成绩表中的学号是学生表的外键。 同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性。 总结一下 1.主键是能确定一条记录的唯一标识 比如 一条记录包括身份正号 姓名 年龄。 身份证号是唯一能确定你这个人的 其他都可能有重复 所以 身份证号是主键。 2.外键用于与另一张表的关联。是能确定另一张表记录的字段 用于保持数据的一致性。 比如 A表中的一个字段 是B表的主键 那他就可以是A表的外键。 二、主键、外键和索引的区别 主键、外键和索引的区别? 主键外键索引 定义:唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键,外键可以有重复的,可以是空值该字段没有重复值,但可以有一个空值。 作用:用来保证数据完整性用来和其他表建立联系用的是提高查询排序的速度。 个数:主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引。 聚集索引和非聚集索引的区别? 聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物

数据库原理期中练习(答案)

一、选择题 1.同一个关系模型的任意两个元组值(A)。 A. 不能全同 B. 可全同 C. 必须全同 D. 以上都不是 2.关系模式R中的属性全部是主属性,则R的最高范式必定是(B )。 A. 2NF B. 3NF C. BCNF D. 4NF 3.下列哪个不是数据库系统必须提供的数据控制功能(B)。 A. 安全性 B. 可移植性 C. 完整性 D. 并发控制 4.若关系R的候选码都是由单属性构成的,则R的最高范式必定是( B )。 A. 1NF B. 2NF C. 3NF D.无法确定 5.下列哪些运算是关系代数的基本运算( D )。 A. 交、并、差 B. 投影、选取、除、联结 C. 联结、自然联结、笛卡尔乘积 D. 投影、选取、笛卡尔乘积、差运算 6.SQL语句的一次查询结果是( D )。 A. 数据项 B. 记录 C. 元组 D. 表 7.在关系R(R#, RN, S#)和S(S#,SN, SD)中,R的主码是R#, S的主码是S#,则S#在R中称为( A )。 A. 外码 B. 候选码 C. 主码 D. 超码 8.在DBS中,DBMS和OS之间关系是(D)。 A. 并发运行 B. 相互调用 C. OS调用DBMS D. DBMS调用OS 9.层次模型、网状模型和关系模型的划分根据是(D)。 A. 记录长度 B. 文件的大小 C. 联系的复杂程度 D. 数据之间的联系 10.下列哪个是单目运算( C )。 A. 差 B. 并 C. 投影 D. 除法 11.采用SQL查询语言对关系进行查询操作,若要求查询结果中不能出现重复元组,可在SELECT子句后增加保留字( A )。 A. DISTINCT B. UNIQUE C. NOT NULL D. SINGLE 12.下列SQL语句中,能够实现“给用户teacher授予查询SC的权限”这一功能的是( A )。 A. GRANT SELECT on SC to teacher B. REVOKE SELECT on SC to teacher C. GRANT SELECT on TABLE to teacher D. REVOKE SELECT on TABLE to teacher 13.设有关系S (SNO,SNAME,DNAME,DADDR),将其规范化到第三范式正确的答案是(B)。

数据库中外键的用法

数据库中外键的用法 数据库中外键的用法的用法你知道吗?下面就跟你们详细介绍 下数据库中外键的用法的用法,希望对你们有用。 数据库中外键的用法的用法如下: 创建主表: mysql> create table parent(id int not null,primary key(id)) engine=innodb; Query OK, 0 rows affected (0.04 sec) 创建从表: mysql> create table child(id int,parent_id int,foreign key (parent_id) references parent(id) on delete cascade) engine=innodb; Query OK, 0 rows affected (0.04 sec) 插入主表测试数据: mysql> insert into parent values(1),(2),(3); Query OK, 3 rows affected (0.03 sec) Records: 3 Duplicates: 0 Warnings: 0 插入从表测试数据: mysql> insert into child values(1,1),(1,2),(1,3),(1,4); ERROR 1452 (23000): Cannot add or update a child row: a

foreign key constraint fails (`test/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE) 因为4不在主表中,插入时发生了外键约束错误。 只插入前三条: mysql> insert into child values(1,1),(1,2),(1,3); Query OK, 3 rows affected (0.03 sec) Records: 3 Duplicates: 0 Warnings: 0 成功! 删除主表记录,从表也将同时删除相应记录: mysql> delete from parent where id=1; Query OK, 1 row affected (0.03 sec) mysql> select * from child; +------+-----------+ | id| parent_id | +------+-----------+ |1 |2 | |1 |3 | +------+-----------+ 2 rows in set (0.00 sec) 更新child中的外键,如果对应的主键不存在,则报错: mysql> update child set parent_id=4 where

!!!数据库考试题及答案

习题 一、[12分] 用英文解释 1、DBMS 2、Data Dictionary 3、Transaction[10分] 二、单项选择题 1.There may be instances where an attribute has a set of values for a specific entity. This type of attribute is said to be 【】 A.single valued attribute B.multivalued attribute C.simple attribute D.composite attribute 2.In a particular bank, a loan can belong to only one customer, and a customer can have several loans, then the relationship set from customer to loan is【】 A.one to many B.many to many C.many to one D.one to one 3.A【】contains metadata─ that is, data about data. A.table B.view C.data dictionary D.trigger 4.The phrase ―greater than at least one‖ is represented in SQL by【】 A.>all B.some 5.In general, all aggregate functions except 【】ignore null values in their input collection. A.sum B.avg C.min D.count 6.If a schedule S can be transformed into a schedule S‘ by a series of swaps of non-conflicting instructions, we say that S and S‘ ar e【】 A.non-conflicting equivalent B.conflict equivalent C.non-conflicting serializable D.conflict serializable 7.The fundamental operations in the relational algebra are【】。 A.∪,-,×,π和σ B.∪,-,∞,π和σ C.∪,∩,×,π和σ D.∪,∩,∞,π和σ 8.In SQL, =some is identical to in, and【】is identical to not in。 A.<>some B.=all C.<>all D.=some 9.The result of true and null is【】。 A.null B.true C.false D.not null 10.The function sum applied on the collection {1,1,3,4,4,11} returns the value【】. A.24 B.6 C.4 D.11

数据库的表关系图

数据库的表关系图 1>:one-to-one(一对一关联)主键关联: 一对一关联一般可分为主键关联和外键关联 主键关联的意思是说关联的两个实体共享一个主键值,但这个主键可以由两个表产生. 现在的问题是: *如何让另一个表引用已经生成的主键值 解决办法: *Hibernate映射文件中使用主键的foreign生成机制 eg:学生表: 添加: 元素的lazy属性为true,表示延迟加载,如果lazy设为false,则表示立即加载.以下对这二点进行说明. 立即加载:表示在从数据库中取得数据组装好一个对象后,会立即再从数据库取得数据组装此对象所关联的对象 延迟加载:表示在从数据库中取得数据组装好一个对象后,不会立即从数据库中取得数据组装此对象所关联的对象, 而是等到需要时,才会从数据库取得数据组装此关联对象. 元素的fetch属性可选为select和join join:连接抓取,Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合. select:查询抓取,Hibernate需要另外发送一条select语句抓取当前对象的关联实体或集合. ******所以我们一般用连接抓取 证件表:

相关文档
相关文档 最新文档