定义主键

通过主键能够唯一定位一条数据记录,而且在进行外键关联的时候也需要被关联的数据表具有主键,所以为数据表定义主键是非常好的习惯。在CREATE TABLE 中定义主键是通过PRIMARY KEY 关键字来进行的,定义的位置是在所有字段定义之后。比如我们为公交车建立一张数据表,这张表中有公交车编号FNumber、驾驶员姓名FDriverName、投入使用年数FUsedYears等字段,其中公交车编号FNumber 字段要定义为主键,那么只要如下设计建表SQL:


MYSQL,MSSQLServer:

CREATE TABLE T_Bus (FNumber VARCHAR(20),FDriverName VARCHAR(20),

FUsedYears INT,PRIMARY KEY (FNumber))

Oracle:

CREATE TABLE T_Bus (FNumber VARCHAR2(20),FDriverName VARCHAR2(20),

FUsedYears NUMBER (10),PRIMARY KEY (FNumber))

DB2:

CREATE TABLE T_Bus (FNumber VARCHAR(20) NOT NULL,FDriverName

VARCHAR(20),

FUsedYears INT,PRIMARY KEY (FNumber))

可以看到,主键定义是在所有字段后的“约束定义段”中定义的,格式为PRIMARY KEY(主键字段名),在有的数据库系统中主键字段名两侧的括号是可以省略的,也就是可以写成PRIMARY KEY FNumber,不过为了能够更好的跨数据库,建议不要采用这种不通用的写法。

需要注意的是,在上边列出的DB2数据库的CREATE TABLE 语句中,我们为FNumber字段设置了非空约束。因为在DB2 中,主键字段必须被添加非空约束,否则会报出类似“"FNUMBER"不能是一列主键或唯一键,因为它可包含空值。”的错误。

有的时候数据表中是不存在一个唯一的主键的,比如某个行业协会需要创建一个保存个人会员信息的表,表中记录了所属公司名称FCompanyName、公司内部工号FInternalNumber、姓名FName 等,由于存在同名的情况,所以不能够使用姓名做为主键,同样由于各个公司之间的内部工号也有可能重复,所以也不能使用公司内部工号做为主键。不过如果确定了公司名称,那么公司内部工号也就唯一了,也就是说通过公司名称FCompanyName 和公司内部工号FInternalNumber 两个字段一起就可以唯一确定一个个人会员了,我们可以让FCompanyName、FInternalNumber 两个字段联合起来做为主键,这样的主键被称为联合主键(或者称为复合主键)。可以有两个甚至多个字段来做为联合主键,这就可以解决一张表中没有唯一主键字段的问题了。定义联合主键的方式和唯一主键类似,只要在PRIMARY KEY后的括号中列出做为联合主键的各个字段就可以了。上面的例子的建表SQL如下:


MYSQL,MSSQLServer,DB2:

CREATE TABLE T_PersonalMember (FCompanyName VARCHAR(20),

FInternalNumber VARCHAR(20),FName VARCHAR(20),

PRIMARY KEY (FCompanyName,FInternalNumber))

Oracle:

CREATE TABLE T_PersonalMember (FCompanyName VARCHAR2(20),

FInternalNumber VARCHAR2(20),FName VARCHAR2(20),

PRIMARY KEY (FCompanyName,FInternalNumber))

DB2:

CREATE TABLE T_PersonalMember (FCompanyName VARCHAR(20) NOT NULL,

FInternalNumber VARCHAR(20) NOT NULL,FName VARCHAR(20),

PRIMARY KEY (FCompanyName,FInternalNumber))

同样需要注意的是,在DB2中组成联合主键的每一个字段也都必须被添加非空约束。采用联合主键可以解决表中没有唯一主键字段的问题,不过联合主键有如下的缺点:

1,效率低。在进行数据的添加、删除、查找以及更新的时候数据库系统必须处理两个字段,这样大大降低了数据处理的速度。

2,使得数据库结构设计变得糟糕。组成联合主键的字段通常都是有业务含义的字段,这与“使用逻辑主键而不是业务主键”的最佳实践相冲突,容易造成系统开发以及维护上的麻烦。

3,使得创建指向此表的外键关联关系变得非常麻烦甚至无法创建指向此表的外键关联关系。

4,加大开发难度。很多开发工具以及框架只对单主键有良好的支持,对于联合主键经常需要进行非常复杂的特殊处理。

考虑到这些缺点,我们应该只在兼容遗留系统等特殊场合才使用联合主键,而在其他场合则应该使用唯一主键。

原文地址:https://www.cnblogs.com/yuyu666/p/9823679.html

时间: 2024-11-12 17:41:02

定义主键的相关文章

Dynamics CRM 2015 Update 1 系列(4): 自己定义主键 - Alternate Keys

Alternate Keys. 还是和系统集成相关的一个重量级Feature.使用该Feature能极大的提高开发数据集成接口的时间成本以及接口的执行效率. 在之前的Dynamics CRM 版本号中.我们仅仅能通过Entity的主键去推断记录的唯一性,如今我们能够通过使用Alternate Keys来推断记录的唯一性.更有趣的则是.我们能够自己去配置实体的Alternate Keys. 眼下Alternate Key仅仅支持文本和数字类型的字段,而且每一个实体最多仅仅能配置5个Key.只是这已

C# DataColumn如何定义主键

当为一列的时候 table.PrimaryKey=new DataColumn[]{table.Columns["CustID"]}; 或者DataColum[] columns=new DataColumn[1];columns[0]=table.columns["CustID"];table.PrimaryKey=columns;当为多列的时候table.PrimaryKey =new DataColumn[]{table.Columns["CustI

Hibernate(4)——主键生成策略、CRUD 基础API区别的总结 和 注解的使用

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: hibernate的主键生成策略 UUID 配置的补充:hbm2ddl.auto属性用法 注解还是配置文件 hibernate注解的基本用法 使用Session API CRUD操作对象,以及对象状态的转换 hibernate缓存的概念 get()/load()的区别到底是什么,源码分析 代理模式实现的懒加载 saveOrUpdate()/merge()的区别 Assigned(常用,一般情况使用很方便):

主键,子外键查询

主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 主键的作用 主键的主要作用如下: (1)保证实体的完整性: (2)加快数据库的操作速度: (3) 在表中添加新记录时,数据库会自

Sql Server 主键 外键约束

主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为表指定了主键约束, 数据库引擎 将通过为主键列自动创建唯一索引来强制数据的唯一性. 当在查询中使用主键时,此索引还允许对数据进行快速访问. 如果对多列定义了主键约束,则一列中的值可能会重复,但来自主键约束定义中所有列的值的任何组合必须唯一. 如下图所示, Purchasing.ProductVend

数据库系统基础笔记(3)--主键/外键 索引

本文转载自:http://www.cnblogs.com/longyi1234/archive/2010/03/24/1693738.html 作者:蔚蓝色的天空 一.什么是主键.外键 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 :  学生表 (学号,姓名,性别,班级)  其中每个学生的学号是唯一的,学号就是一个主键  课程表(课程编号,课程名,学分)  其中课程编号是唯一的,课程编号就是一个主键  成绩表(学号,课

主键、外键和子查询

1 主键和外键的区别 1.1定义 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空 1.2作用 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 1.3个数: 主键--主键只能有一个 外键--一个表可以有多个外键 2 主键语句code int PRIMARY KEY IDENTITY(1,1), --PRIMARY KEY 标识主键--IDENTITY(1,1) 从一开始,每增加一行加一: 插入数据不用再写. 3 外键

SQL的主键和外键的作用

SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除. (4)更新主键记录时,同样有级联更新和拒绝执行的选择. 简而言之,SQL的主键和外键就是起约束作用. 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,

SQL主键&外键

SQL的主键和外键约束 SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值. (1)插入非空值时,如果主键表中没有这个值,则不能插入. (2)更新时,不能改为主键表中没有的值. (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除. (4)更新主键记录时,同样有级联更新和拒绝执行的选择. 简而言之,SQL的主键和外键就是起约束作用. 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学