文档库 最新最全的文档下载
当前位置:文档库 › 关于数据库主键和外键

关于数据库主键和外键

关于数据库主键和外键
关于数据库主键和外键

关于数据库主键和外键

一、什么是主键、外键

关系型数据库中的一条记录中有若干个属性 若其中某一个属性组(注意是组)能唯一标识一条记录 该属性组就可以成为一个主键

比如

学生表(学号 姓名 性别 班级) ,其中每个学生的学号是唯一的,学号就是一个主键,课程表(课程编号,课程名,学分) 。其中课程编号是唯一的,课程编号就是一个主键。成绩表(学号,课程号,成绩) 。

成绩表中单一一个属性无法唯一标识一条记录 学号和课程号的组合才可以唯一标识一条记录 所以学号和课程号的属性组是一个主键。

成绩表中的学号不是成绩表的主键 但它和学生表中的学号相对应。并且学生表中的学号是学生表的主键 则称成绩表中的学号是学生表的外键。

同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性。

总结一下

1.主键是能确定一条记录的唯一标识 比如 一条记录包括身份正号 姓名 年龄。

身份证号是唯一能确定你这个人的 其他都可能有重复 所以 身份证号是主键。

2.外键用于与另一张表的关联。是能确定另一张表记录的字段 用于保持数据的一致性。

比如 A表中的一个字段 是B表的主键 那他就可以是A表的外键。

二、主键、外键和索引的区别

主键、外键和索引的区别?

主键外键索引

定义:唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键,外键可以有重复的,可以是空值该字段没有重复值,但可以有一个空值。

作用:用来保证数据完整性用来和其他表建立联系用的是提高查询排序的速度。

个数:主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引。

聚集索引和非聚集索引的区别?

聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。

聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。

三、数据库中主键和外键的设计原则

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物

理数据库的性能和可用性都有着决定性的影响。

必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境 就很难对这些键进行修改 所以在开发阶段就设计好主键和外键就是非常必要和值得的。

主键:关系数据库依赖于主键---它是数据库物理模式的基石。

主键在物理层面上只有两个用途:

1.惟一地标识一行。

2.作为一个可以被外键有效引用的对象。

基于以上这两个用途 下面给出了我在设计物理层面的主键时所遵循的一些原则:

1.主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据 并抱怨它没有什么用处 那就证明它的主键设计地很好。

2.主键应该是单列的 以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱 而这两个理由都是错误的。其一是主键应当具有实际意义。然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键。我也反对这种做法,理由是,复合主键常常导致不良的外键,即当连接表成为另一个从表的主表。而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表。其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

3.永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了。所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

4.主键不应包含动态变化的数据 如时间戳、创建时间列、修改时间列等。

5.主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机。这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

四、数据库主键选取策略

我们在建立数据库的时候,需要为每张表指定一个主键。所谓主键就是能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不过就不在这里讨论了。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。

常见的数据库主键选取方式有

·自动增长字段

·手动增长字段

·UniqueIdentifier

·"COMB(Combine)"类型

1自动增长型字段

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

尽管自动增长型字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下 很难预先填写主键与外键的值。假设有两张表

Order(OrderID,OrderDate)

OrderDetial(OrderID,LineNum,ProductID,Price)

Order表中的OrderID是自动增长型的字段。现在需要我们录入一张订单,包括在Order 表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生:

首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务保护下同时进行,即确保两表同时更行成功。显然它们是相互矛盾的。

除此之外,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突。设想一个数据库中的Order表向另一个库中的Order表复制数据库时 OrderID到底该不该自动增长呢?

https://www.wendangku.net/doc/7115447711.html,允许我们在DataSet中将某一个字段设置为自动增长型字段。但千万记住,这个自动增长字段仅仅是个占位符而已,当数据库进行更新时,数据库生成的值会自动取代https://www.wendangku.net/doc/7115447711.html,分配的值。所以为了防止用户产生误解,建议大家将https://www.wendangku.net/doc/7115447711.html,中的自动增长初始值以及增量都设置成-1。此外,在https://www.wendangku.net/doc/7115447711.html,中 我们可以为两张表建立DataRelation 这样存在级联关系的两张表更新时,一张表更新后另外一张表对应键的值也会自动发生变化,这会大大减少了我们对存在级联关系的两表间更新时自动增长型字段带来的麻烦。

2手动增长型字段

既然自动增长型字段会带来如此的麻烦 我们不妨考虑使用手动增长型的字段,也就是说主键的值需要自己维护,通常情况下需要建立一张单独的表存储当前主键键值。还用上面的例子来说,这次我们新建一张表叫IntKey,包含两个字段,KeyName以及KeyValue。就像一个HashTable,给一个KeyName,就可以知道目前的KeyValue是什么 然后手工实现键值

数据递增。在SQL Server中可以编写这样一个存储过程,让取键值的过程自动进行。代码如下:

CREATEPROCEDURE[GetKey]

@KeyNamechar(10),

@KeyValueint OUTPUT AS UPDATE

IntKeySET@KeyValue=KeyValue=KeyValue+1WHERE KeyName=@KeyName GO

这样,通过调用存储过程,我们可以获得最新键值,确保不会出现重复。若将OrderID 字段设置为手动增长型字段,我们的程序可以由以下几步来实现,首先调用存储过程 获得一个OrderID,然后使用这个OrderID填充Order表与OrderDetail表,最后在事务保护下对两表进行更新。

使用手动增长型字段作为主键在进行数据库间数据复制时,可以确保数据合并过程中不会出现键值冲突,只要我们为不同的数据库分配不同的主键取值段就行了。但是,使用手动增长型字段会增加网络的RoundTrip,我们必须通过增加一次数据库访问来获取当前主键键值 这会增加网络和数据库的负载,当处于一个低速或断开的网络环境中时 这种做法会有很大的弊端。同时,手工维护主键还要考虑并发冲突等种种因素 这更会增加系统的复杂程度。

3使用UniqueIdentifier SQL Server为我们提供了UniqueIdentifier数据类型,并提供了一个生成函数NEWID(),使用NEWID()可以生成一个唯一的UniqueIdentifier。UniqueIdentifier 在数据库中占用16个字节,出现重复的概率非常小,以至于可以认为是0。我们经常从注册表中看到类似

{45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}

的东西实际上就是一个UniqueIdentifier,Windows用它来做COM组件以及接口的标识 防止出现重复。在.NET里管UniqueIdentifier称之为GUID(Global Unique Identifier)。在C#中可以使用如下命令生成一个GUID:

Guid u=System.Guid.NewGuid()

对于上面提到的Order与OrderDetail的程序,如果选用UniqueIdentifier作为主键的话 我们完全可以避免上面提到的增加网络RoundTrip的问题。通过程序直接生成GUID填充主键 不用考虑是否会出现重复。

UniqueIdentifier字段也存在严重的缺陷。首先,它的长度是16字节,是整数的4倍长 会占用大量存储空间。更为严重的是,UniqueIdentifier的生成毫无规律可言,要想在上面建立索引(绝大多数数据库在主键上都有索引)是一个非常耗时的操作。有人做过实验,插入同样的数据量,使用UniqueIdentifier型数据做主键要比使用Integer型数据慢。所以,出于效率考虑,尽可能避免使用UniqueIdentifier型数据库作为主键键值。

4使用"COMB(Combine)"类型

既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用COMB类型(数据库中没有COMB类型。它是Jimmy Nilsson在他的"The Cost of GUIDs as Primary Keys"一文中设计出来的),可以在三者之间找到一个很好的平衡点。

COMB数据类型的基本设计思路是这样的 既然UniqueIdentifier数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么我们能不能通过组合的方式,保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime) 这样我们将时间信息与UniqueIdentifier组合起来。在保留UniqueIdentifier的唯一性的同时增加了有序性,以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复。其实不用担心,后6字节的时间精度可以达到1/300秒,两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:

DECLARE@aGuidUNIQUEIDENTIFIER

SET@aGuid=CAST(CAST(NEWID()ASBINARY(10))

+CAST(GETDATE()ASBINARY(6))ASUNIQUEIDENTIFIER)

经过测试 使用COMB做主键比使用INT做主键 在检索、插入、更新、删除等操作上仍然显慢,但比Unidentifier类型要快上一些。关于测试数据可以参考我2004年7月21日的随笔。

除了使用存储过程实现COMB数据外 我们也可以使用C#生成COMB数据,这样所有主键生成工作可以在客户端完成。C#代码如下:

//==

///summary

///返回GUID用于数据库操作 特定的时间代码可以提高检索效率

////summary

///returns COMB(GUID与时间混合型)类型GUID数据/returns publicstaticGuidNewComb()

{

byte guidArray=System.Guid.NewGuid().ToByteArray()

DateTimebaseDate=new DateTime(1900,1,1)

DateTime now=DateTime.Now

//Get the days and milliseconds which will be used to build the

byte string TimeSpan days=new TimeSpan(now.Ticks-baseDate.Ticks)

TimeSpanmsecs=new TimeSpan(now.Ticks-(new

DateTime(now.Year,now.Month,now.Day).Ticks))

//Convert to abyte array

//Note that SQL Server is accurate to 1/300th of amillisecond so we divide by 3.333333 byte daysArray=BitConverter.GetBytes(days.Days);

byte msecsArray=BitConverter.GetBytes((long)(msecs.TotalMilliseconds/3.333333));

//Reverse the bytes to match SQL Servers ordering

Array.Reverse(daysArray)

Array.Reverse(msecsArray)

//Copy the bytes into the guid

Array.Copy(daysArray,daysArray.Length-2,guidArray,guidArray.Length-6,2)

Array.Copy(msecsArray,msecsArray.Length-4,guidArray,guidArray.Length-4,4) Returnnew System.Guid(guidArray);

}

//==

///summary

///从SQL SERVER返回的GUID中生成时间信息

////summary

///param name="guid"包含时间信息的COMB/param

///returns时间/returns publicstaticDateTime

GetDateFromComb(System.Guidguid)

{

DateTimebaseDate=new DateTime(1900,1,1)

byte daysArray=newbyte[4]

byte msecsArray=newbyte[4]

byte guidArray=guid.ToByteArray()

//Copy the date parts of the guid to the respective byte arrays.

Array.Copy(guidArray,guidArray.Length-6,daysArray,2,2)

Array.Copy(guidArray,guidArray.Length-4,msecsArray,0,4)

//Reverse the arrays to put them into the appropriate order

Array.Reverse(daysArray)

Array.Reverse(msecsArray)

//Convert the bytes to intsint

days=BitConverter.ToInt32(daysArray,0)

intmsecs=BitConverter.ToInt32(msecsArray,0)

DateTime date=baseDate.AddDays(days)

date=date.AddMilliseconds(msecs*3.333333)

return date;

}

数据库主键和外键的作用

数据库主键和外键的作用 首先介绍一下什么是主键、什么是外键。 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语句抓取当前对象的关联实体或集合. ******所以我们一般用连接抓取 证件表:

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