精华内容
下载资源
问答
  • 数据库主键表和外键

    千次阅读 2013-03-24 11:06:33
    想写这个是因为自己刚好尝试建一个数据库,而数据库的各个之间的关系不是很清楚,没有形成一个整体的关系,所以就尝试着将数据库形成一个整理的关系,我 敢说很多跟我一样的同学原来做课程设计,肯定就是随便...

           

                 想写这个是因为自己刚好在尝试建一个数据库,而数据库的各个表之间的关系不是很清楚,没有形成一个整体的关系,所以就尝试着将数据库形成一个整理的关系表,我

    敢说很多跟我一样的同学原来做课程设计,肯定就是随便建几个table,然后能够用程序,也就是你的软件系统对你的各个table进行增删查改,以为数据库就建好了,已经ok了。

                其实这一半的事情都没有做到,我们说一个系统的数据库是一个整体,虽然我不是很懂那些范式神马的,但是这个也是我自己的一点经验只谈。

                肯定有很多用SQL Server的图形界面设计数据库的 ,可以用你数据库的表生成你的关系数据库图, 你会发现你的关系数据库图是一张张独立的表,之间没有任何的关联,

    如果这样,那建立好的数据库table就不能形成一个整体的关系。但一般建立好的表之间是存在关系的,如果建立这些关系就是要说的问题。

                这里涉及几个重要的概念,下面先给出这些概念的定义:

                                   主键:唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性,主键只能有一个。

                                  外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系,一个表可以有多个外键。

               而在建立表的关系的时候又会有主键表和外键表。

               这个是比较迷惑的问题而且很容易选错,选错了就无法顺利在表与表之间建立关系。

               参考别人给出的一些说法: 

                                                         外键表就是要建外键的表,

                                                         主键表是因为外键在另一个表上是主键。所以叫做主键表。

                怎么理解这上面的两句话,举个例子最明白,我们见了两张表,一个表为,我们设主键为PatientID,

                    然后我们在建立一张表,这里我设置的主键是SectNumber,这两表之间RaportList Table通过外键PatientID与Patient Table的主

              键 PatientID关联,参考上面的总结,那就是ReportList  Table是外键表(要建外键的表),Patient Table就是主键表,在网上搜资料的时候可能会介绍到说外键表可以说  

             是主键表的一个属性,我觉得是刚好说反了,在用Sql Server建立关系的过程中就会发现这个问题。

                  顺便说下用Sql Server给表之间建立关系的步骤,先找到外键表,右键 -->  修改 -> 右键 --->关系--->添加  --->表和列规范  -->省略号-->设置主键表,对应的键。

                 保存之后生成关系就看得到了,ok!

     

     

     

     

     

    展开全文
  • 数据库主键和外键定义

    千次阅读 2015-07-07 15:01:24
    主键用于唯一标识中的行数据,不能为空,一个主键值对应一行数据。...约束内的数据的更新,从定义外键时可以发现 外键是和主键表联系,数据类型要统一,长度(存储大小)要统一。这样更新数据的时候会保持一致性。
    主键用于唯一标识表中的行数据,不能为空,一个主键值对应一行数据。另外,会自动在主键上创建索引,用于加快查询。


    外键用于两个表的联系。两个表必须具有相同类型的属性,在该属性上有相同的值。该属性应为其中一个表的主键,在另外一个表设置为外键。约束内表的数据的更新,从定义外键时可以发现 外键是和主键表联系,数据类型要统一,长度(存储大小)要统一。这样在更新数据的时候会保持一致性。

    展开全文
  • 数据库表主键设计原则

    万次阅读 2017-07-08 10:52:49
    阅读《阿里 Java 开发手册》时,以下 MySQL 建表规约: 必备三字段:id, gmt_create, gmt_modified。 说明:其中id必为主键,类型为unsigned bigint、单时自增、步长为1。gmt_create, gmt_modified的类型均...

    阅读《阿里 Java 开发手册》时,有以下 MySQL 建表规约:

    表必备三字段:id, gmt_create, gmt_modified。 说明:其中id必为主键,类型为unsigned
    bigint、单表时自增、步长为1。gmt_create, gmt_modified的类型均为date_time类型。

    这样的要求似乎是违反数据设计的范式的,但既然手册中强调这点就搜索学习了一下这样做的理由以及相关的表设计原则。

    1. 数据库设计的三大范式
      ◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。简而言之,第一范式就是无重复的列
      ◆ 第二范式(2NF):首先要满足它是1NF,另外还需要包含两部分内容:一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。简而言之,第二范式就是非主属性非部分依赖于主关键字
      ◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
    2. 反范式主键的设计原则
      ◆ 主键应当是对用户没有意义的。业务上的‘主键’可以通过唯一键(Unique Key)或唯一索引(Unique Index)和其它约束条件实现
      ◆ 主键应该是单列的,以便提高连接和筛选操作的效率
      ◆ 不要更新主键。实际上,因为主键除了惟一地标识一行之外再没有其他的用途了,所以也就没有理由去对它更新。另外,主键的值通常不重用,意味着记录被删除后,该主键值不再使用
      ◆ 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等
      ◆ 主键应当由计算机自动生成。文章 Choose a Primary Key: Natural or Surrogate 中介绍了几种常见的实现代理主键的方式。
      1) 数据库自动生成,例如自增列或者 SEQUENCE;
      2) MAX() + 1,设定主键列为整数列,从 1 开始,每次有插入新列时,将其主键值设定为当前最大值加 1。这种方式的每次都要找到当前最大键值,会影响效率;
      3) Universally unique identifiers (UUIDs). UUIDs are 128-bit values that are created from a hash of the ID of your Ethernet card, or an equivalent software representation, and the current datetime of your computer system. The algorithm for doing this is defined by the Open Software Foundation;
      4) Globally unique identifiers (GUIDs). GUIDs are a Microsoft standard that extend UUIDs, following the same strategy if an Ethernet card exists and if not then they hash a software ID and the current datetime to produce a value that is guaranteed unique to the machine that creates it;
      5) High-low strategy. The basic idea is that your key value, often called a persistent object identifier (POID) or simply an object identified (OID), is in two logical parts: A unique HIGH value that you obtain from a defined source and an N-digit LOW value that your application assigns itself. Each time that a HIGH value is obtained the LOW value will be set to zero. For example, if the application that you’re running requests a value for HIGH it will be assigned the value 1701. Assuming that N, the number of digits for LOW, is four then all persistent object identifiers that the application assigns to objects will be combination of 17010000,17010001, 17010002, and so on until 17019999. At this point a new value for HIGH is obtained, LOW is reset to zero, and you continue again. If another application requests a value for HIGH immediately after you it will given the value of 1702, and the OIDs that will be assigned to objects that it creates will be 17020000, 17020001, and so on. As you can see, as long as HIGH is unique then all POID values will be unique.
      反范式跟范式所要求的正好相反,在反范式的设计模式,我们可以允许适当的数据的冗余,用这个冗余去取操作数据时间的缩短。本质上就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联(手册中也有禁止三表以上 JOIN 的条款)。
      但需要注意的是,采用代理主键是为了避免业务逻辑变化导致主键变更,以及提高 JOIN 效率等。但在实际查询中,数据查询还是需要通过业务上的唯一键进行匹配的,而不应该将代理主键作为查询条件,尤其不能将代理主键作为查询条件输入项提供给用户。
    3. 唯一键(Unique Key)和唯一索引(Unique Index)
      从设计意图来看,如果目的是为了强调业务规则上的唯一性,则应该使用唯一键;如果只是为了提高查询效率,则应该使用唯一索引。从数据库系统的角度看,索引是存储在数据库中的物理结构;而键只是一种逻辑概念。从用户的角度看,二者的效果是一致的。如果表 B 想要使用的表 A 的列作为其外键,那么表 A 中对应的列应该是唯一键而不能是唯一索引——因为从定义上,外键也属于业务规则相关的概念,它应当关联另一个表的候选键。(By definition a foreign key must reference a candidate key of some table. It doesn’t necessarily have to be the primary key.)
      一般地,创建唯一键或主键的同时,数据库都会自动生成对应的唯一索引。主键列不允许空值,但是唯一键和唯一索引列都是允许空值存在的,另外可以删除唯一键上的索引,但是保留唯一键,只是此时唯一键只剩下了概念,并不能保证数据实际的唯一性了。
    4. 外键
      外键用来保持数据的一致性和完整性,主要目的是根据参考表来控制拥有其列作为外键的表中的数据,是两张表形成关联。同时可设定参考表和外键表之间的级联操作(ON DELETE 和 ON UPDATE)。关于外键,《阿里 Java 开发手册》不上有以下的说明可以参考。

    不得使用外键与级联,一切外键概念必须在应用层解决。
    说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,则为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

    总体来说,实际应用中应当具体问题具体分析,结合范式和反范式两种设计思想。对数据一致性和完整性较高、而对查询效率要求并不严格的地方,应当更倾向于遵从范式;而类似分布式、高并发集群的场景,则应当更考虑反范式的设计方案。具体主键的选取原则与策略,请参考文章 Choose a Primary Key: Natural or Surrogate

    展开全文
  • 数据库主键、联合主键

    千次阅读 2019-09-18 22:41:43
    数据库主键是用来标记数据记录唯一性的列,不能为空,不能重复。 主键具有的特点:唯一性、非空性。 数据库联合主键:可以将多个列作为主键。(当多个列一起作为主键时,这里面的列均不能为空,但列值可以重复(不能...

    数据库主键是用来标记数据记录唯一性的列,不能为空,不能重复。
    主键具有的特点:唯一性、非空性。
    数据库联合主键:可以将多个列同时作为主键。(当多个列一起作为主键时,这里面的列均不能为空,但列值可以重复(不能所有的列值均一样,至少有一个不同))

    当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。
    下面使用Navicat进行练习
    新建一个STUDENT表
    在这里插入图片描述
    后面的小钥匙就代表了主键,再点一下,可以取消。
    在这里插入图片描述
    下面的图中,这两个是同一表的两种显示方式。其中一个可以进行数据插入。其中一个可以更改表结构。
    (点击左侧的表名,右键->打开表,或者右键->设计表 也可以实现这两种显示)
    在这里插入图片描述
    增加记录(点下面的+)、删除记录(-)、以及保存记录(点对勾)。
    在这里插入图片描述
    更改表结构后,点保存即可完成更改。
    在这里插入图片描述
    若表结构中有多个列一起作为主键,则它们均不能为空,(即“不是null” 要选),否则会报错!
    在这里插入图片描述

    展开全文
  • 我的电脑系统:Windows 10 64位 SQL Server 软件版本: SQL Server 2014 Express ...(如果主键是用于集群式服务(指跨数据库服务,比如:跨行转账),才可以考虑用字符串当主键。) 主键的值通常都不允
  • 关系数据库表主键和外键

    千次阅读 2013-08-03 15:31:20
    关系型数据库中的一条记录中若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生(学号,姓名,性别,班级)  其中每个学生的学号是唯一的,学号就是一个...
  • 数据库表可以没有主键吗?

    千次阅读 2020-09-08 14:55:33
    3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。 4) 数据库自动按主键值的顺序显示中的记录。如果没有定义主键,则按输入记录的顺序显示中的记录。 主键不是非要...
  • SQLServer数据库添加主键主键自增

    千次阅读 2019-10-17 16:25:59
    选中要添加主键自增的,右键选择设计 点击列,右键选择设置主键,效果如下: 下边列属性,找到标识规范,点击左边的小加号,点击是标识 选择是,然后定义标识增量(每次增多少),标识...
  • SQLServer数据库设置主键主键自增

    万次阅读 2019-06-21 07:36:34
    想要设置主键的那一行,右击就会出现如下图所示的页面,点击设置主键 如何设置主键自增 设计的页面的下方,一个标识规范,(是标识),后面点击是,默认是否,就可以了 ...
  • 关系型数据库主键外键

    千次阅读 2021-01-11 21:55:07
    一对一:既可以A的主键充当B的外键,也可以B的主键充当A的外键(一个人只有一把钥匙,一把钥匙只给一个人) 一对多:把A的主键充当B的外键(一个父亲几个孩子,一个孩子只有一个父亲) 多对多:...
  • Oracle数据库联合主键

    千次阅读 2018-09-13 01:25:03
     主键Oracle中,主键指能唯一标识一条记录的单个数据列或联合的数据列(联合主键|复合主键)。主键用到的数据 列数据不能包含空值。而且,一张只能包含一个主键。 2、作用:  数据的联合主键组合...
  • 数据库主键和外键

    千次阅读 2019-07-03 15:49:56
    数据库主键是指中一个列或列的组合,其值能唯一地标识中的每一行。这样的一列或多列称为的主键,通过它可强制的实体完整性。一个只能一个PRIMARY KEY约束,而且PRIMARY KEY约束中的列不能接受空值。 ...
  • 如何在数据库表中建立复合主键

    万次阅读 2014-05-29 10:41:05
    (即多个字段同时作为主键主键数据库表的一个重要属性,建立主键可以避免中存在完全相同的记录,也就是说主键在一张中的记录值是唯一的。 建立主键有两种方法:一种是在数据库提供的GUI环境中建立,另一种...
  • @Entity @Table(name = "contract") public class Contract ...当我的contractNo定义成String类型是创建数据的时候会报错,定义成int、Long、Integer类型就不会,要怎么设置才能创建varchar类型的数据数据
  • MySQL数据库主键和外键详解

    千次阅读 2020-03-20 20:15:42
    MySQL数据库主键和外键详解 主键 主键定义 主键中经常一个列或多列的组合,其值能唯一地标识中的每一行。这样的一列或多列称为主键,通过它可强制的实体完整性。当创建或更改时可通过定义 ...
  • 如何选择数据库主键

    千次阅读 2013-06-25 09:52:05
     我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单吧,会“订单编号”字段,而这个字段呢业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订单编号...
  • 数据库 联合主键 的含义

    千次阅读 2018-09-08 14:50:02
    联合主键一般用于在一条数据可能重复的情况下,用另一条数据去保持其唯一...这时在创建数据的时候可以在末尾加上: PRIMARY KEY(name, phone) 表示用 name 与 phone 构成联合主键,复合主键以保持记录的唯一性...
  • SQL SERVER数据库表主键设计(一)

    千次阅读 2008-12-06 23:55:00
    SQL SERVER数据库表主键设计(一) 1. 序言 当前,随着信息量的急剧增加,对于数据的存储和管理方式,各企业都逐渐摆脱了之前的依靠文件系统(文本文件或者Excel)或者一些桌面型的小型数据库系统(如Access、...
  • mysql数据库表主键、外键、唯一键、主键索引、唯一索引、普通索引:
  • 高并发 数据库自增主键 解决

    千次阅读 2011-03-16 13:33:00
    一般情况下,新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键一定程度上有利于程序性能的优化和应用移植性的...使用数据库的自增主键 我们经常使用数据的自增字段作为表主键,也即主键值不
  • 数据库主键的作用

    千次阅读 2007-12-23 12:10:00
    我们建立数据库的时候,需要为每张指定一个主键,所谓主键就是能够唯一标识中某一行的属性或属性组,一个只能一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新...
  • hibernate 映射无主键和复合主键数据库表(1) 复合主键通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 例如:一个SYS_PERSON定义如下 firstname,...
  • SQL数据库主键和外键的应用实例

    万次阅读 2018-10-26 09:26:53
    数据库主键(Primary Key):指的是一个列或多列的属性组合,其属性值能唯一标识一条记录,通过它可强制的实体完整性。   例如: (tb_Book :BookName、Author、Publishing、ISBN、BookClass、Count........
  • 数据库主键设计

    千次阅读 2010-03-08 10:06:00
    主键的必要性 : 有些朋友可能不提倡数据库表必须要主键,但我的思考中,觉得每个都应该具有主键,不管是单主键还是双主键主键的存在就代表着结构的完整性,的记录必须得唯一区分的字段,主键主要是用于...
  • 为什么数据库有主键

    千次阅读 2015-01-25 17:28:13
    主键: 概念 主关键字(主键,primary key)是被挑选出来,作的行的惟一标识的候选关键字。...3) 在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。 4)
  • 主键数据库表的一个重要属性,建立主键可以避免中存在完全相同的记录,也就是说主键在一张中的记录值是唯一的。 建立主键有两种方法:一种是在数据库提供的GUI环境中建立,另一种是通过SQL语句执行建立,下面...
  • 数据库主键和外键的设计原则

    千次阅读 2007-04-20 15:20:00
    主键和外键是把多个组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个...
  • MySql数据库主键外键与数据库设计

    千次阅读 2019-05-20 01:38:57
    MySql数据库主键外键与数据库设计
  • 数据库主键设计原则

    千次阅读 2007-04-20 14:17:00
    或许大家都设计过数据库,也为表定义主键,今天我想阐述的是,应该如何正确的设计一个主键,以往的一些资料中,都没有提及到主键设计的原则.我为此总结了一下:1.是否要采用GUID作为主键用GUID作主键有它的优势与不足....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,261
精华内容 85,704
关键字:

数据库有主键可以在表集定义