精华内容
下载资源
问答
  • 简要介绍了数据的主键和外键,在实践的生产中主键和外键的作用异常的重要
  • 创建外键语法 ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[约束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ; 3.使用组合主键 如果一列不能唯一区分一...
  • 主键和外键区别 主键是定义一个表中起主要作用的数据项,这些数据项的数据在表中是唯一的,同时系统按主键为表建立索引。 外键是定义一个表中的某数据项的数据,要参照另一个表的主键数据。既没有在另一个表的...
  • 主键和外键区别

    万次阅读 多人点赞 2018-11-30 09:41:00
    一、什么是主键外键 主键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 。 比如 1.学生表(学号,姓名,性别,班级) 其中每个学生的...

    一、什么是主键、外键

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

    比如
    1.学生表(学号,姓名,性别,班级)
    其中每个学生的学号是唯一的,学号就是一个主键

    2.课程表(课程编号,课程名,学分)
    其中课程编号是唯一的,课程编号就是一个主键

    3.成绩表(学号,课程号,成绩)
    成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个主键 。
    成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键 。
    同理 成绩表中的课程号是课程表的外键。

    外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

    二、主键和外键的用途

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
    1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

    身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
    2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

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

    三、主键设计原则

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

        1. 惟一地标识一行。
    
        2. 作为一个可以被外键有效引用的对象。
    

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

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

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

    说明主键外键索引
    定义唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键, 外键可以有重复的, 可以是空值该字段没有重复值,但可以有一个空值
    作用用来保证数据完整性用来和其他表建立联系用的提高查询排序的速度
    个数主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引
    展开全文
  • 主键主键外键和索引A “key” is one of the most basic and important concepts of the Database Management System (DBMS); the keys helps us work easily with the records and the tables in our database by ...

    主键主键外键和索引

    A “key” is one of the most basic and important concepts of the Database Management System (DBMS); the keys helps us work easily with the records and the tables in our database by providing us with the ease of accessing and retrieving the data from the table. A primary key is the first key to be understood as it uniquely identifies the particular record of any table. The primary key and foreign key however, must not be confused with each other as they have a completely different definition as well as usage. Here are the differences between the two.

    “密钥”是数据库管理系统(DBMS)的最基本和最重要的概念之一; 这些键通过使我们能够轻松地访问和检索表中的数据,从而帮助我们轻松地处理数据库中的记录和表。 主键是第一个要理解的键,因为它唯一地标识任何表的特定记录。 但是,主键和外键不能相互混淆,因为它们的定义和用法完全不同。 这是两者之间的区别。

    Difference between Primary Key and Foreign Key

    Image Source

    图片来源

    主键和外键之间的区别 (Difference between Primary Key and Foreign Key)

    S.no.Primary keyForeign key
    1The primary key of a particular table is the attribute which uniquely identifies every record and does not contain any null value.The foreign key of a particular table is simply the primary key of some other table which is used as a reference key in the second table.
    2A primary key attribute in a table can never contain a null value.A foreign key attribute may have null values as well.
    3Not more than one primary key is permitted in a table.A table can have one or more than one foreign key for referential purposes.
    4Duplicity is strictly prohibited in the primary key; there cannot be any duplicate values.Duplicity is permitted in the foreign key attribute, hence duplicate values are permitted.
    5Example:

    Consider the table student, which keeps record of students in a class:

    Here, Id is the primary key which uniquely identifies each record in the table “student”

    IDNAMEAddress
    101ABCx
    102DEFy
    103GHIz
    104JKLw
    Now, let us consider the table teacher, which records the teachers in the school:

    Here Tid or teacher id is the unique primary key, for each record in the table. This table uses the “ID” attribute which is the primary key of the “student” table as its reference key or foreign key to refer to the student the particular teacher teaches, :

    TIDNAMETAddressID
    1PriyaP101
    2RiyaR102
    3SamS102
    4TomT103

    Since one student is taught by more than one teachers, the ID attribute (which is the foreign key in this table), contains duplicate values.

    序号 首要的关键 外键
    1个 特定表的主键是可唯一标识每条记录且不包含任何空值的属性。 特定表的外键只是其他表的主键,在第二个表中用作参考键。
    2 表中的主键属性永远不能包含空值。 外键属性也可以具有空值。
    3 一个表中最多只能有一个主键。 一个表可以具有一个或多个外键以供参考。
    4 主键中严格禁止重复; 不能有任何重复的值。 外键属性中允许重复,因此允许重复值。
    5 例:

    考虑一下表格学生,该表格保留班级学生的记录:

    在此,Id是唯一标识表“ student”中每个记录的主键

    ID 名称 地址
    101 美国广播公司 X
    102 防御 ÿ
    103 GHI ž
    104 JKL w
    现在,让我们考虑表老师,它记录了学校中的老师:

    对于表中的每个记录,此处的Tid或Teacher ID是唯一的主键。 该表使用作为“学生”表主键的“ ID”属性作为其参考键或外键来引用特定老师所教的学生:

    工业贸易署 名称 地址 ID
    1个 普里亚 P 101
    2 里雅 [R 102
    3 山姆 小号 102
    4 汤姆 Ť 103

    由于一位学生由多位老师教,因此ID属性(此表中的外键)包含重复的值。

    The foreign key of one table although is derived from the primary key of the other table, holds completely different characteristics and these differences are crucial which should be taken care of to avoid any errors.

    一个表的外键虽然是从另一表的主键派生而来的,但它们具有完全不同的特征,这些差异至关重要,应注意避免任何错误。

    Comment below if you have queries related to primary key vs foreign key.

    如果您对主键和外键有疑问,请在下面评论。

    翻译自: https://www.thecrazyprogrammer.com/2019/04/difference-between-primary-key-and-foreign-key.html

    主键主键外键和索引

    展开全文
  • 一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,性别,班级)  其中每个学生的...
    一、什么是主键、外键:
     
    

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

    身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 
    2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性

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

     

     

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

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

     

    主键

    外键

    索引

    定义:

    唯一标识一条记录,不能有重复的,不允许为空

    表的外键是另一表的主键外键可以有重复的可以是空值

    该字段没有重复值,但可以有一个空值

    作用:

    用来保证数据完整性

    用来和其他表建立联系用的

    是提高查询排序的速度

    个数:

    主键只能有一个

    一个表可以有多个外键

    一个表可以有多个惟一索引

     

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

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

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

     

     

     

     

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

    主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

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

    主键:

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

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

            1. 惟一地标识一行。

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

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

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

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

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

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

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

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

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

     

    四、数据库主键选取策略

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

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

    · 自动增长字段

    · 手动增长字段

    · UniqueIdentifier

    · “COMBCombine类型

    1自动增长型字段

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

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

    Order(OrderIDOrderDate)
    OrderDetial(OrderID, LineNumProductID, Price)

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

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

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

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

    2手动增长型字段

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

    关于数据库主键和外键(终于弄懂啦)CREATE PROCEDURE [GetKey]
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)@KeyName char(10), 
    关于数据库主键和外键(终于弄懂啦)@KeyValue int OUTPUT 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)AS
    关于数据库主键和外键(终于弄懂啦)UPDATE IntKey SET @KeyValue = KeyValue = KeyValue + 1 WHERE KeyName = @KeyName
    关于数据库主键和外键(终于弄懂啦)Go关于数据库主键和外键(终于弄懂啦)

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

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

    3使用UniqueIdentifier

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

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

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

    关于数据库主键和外键(终于弄懂啦)Guid System.Guid.NewGuid();

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

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

    4使用“COMBCombine类型

    既然上面三种主键类型选取策略都存在各自的缺点,那么到底有没有好的办法加以解决呢?答案是肯定的。通过使用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秒内生成的两个GUID10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:

    关于数据库主键和外键(终于弄懂啦)DECLARE @aGuid UNIQUEIDENTIFIER
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)SET @aGuid = CAST(CAST(NEWID() AS BINARY(10)) 
    关于数据库主键和外键(终于弄懂啦)+ CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)

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

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

    关于数据库主键和外键(终于弄懂啦)//================================================================
    关于数据库主键和外键(终于弄懂啦)///<summary>
    关于数据库主键和外键(终于弄懂啦)/// 返回 GUID 用于数据库操作,特定的时间代码可以提高检索效率
    关于数据库主键和外键(终于弄懂啦)/// </summary>
    关于数据库主键和外键(终于弄懂啦)/// <returns>COMB (GUID 与时间混合型类型 GUID 数据</returns>
    关于数据库主键和外键(终于弄懂啦)public static Guid NewComb() 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     byte[] guidArray System.Guid.NewGuid().ToByteArray(); 
    关于数据库主键和外键(终于弄懂啦)     DateTime baseDate 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); 
    关于数据库主键和外键(终于弄懂啦)     TimeSpan msecs new TimeSpan(now.Ticks (new DateTime(now.Year, now.Month, now.Day).Ticks)); 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     // Convert to byte array 
    关于数据库主键和外键(终于弄懂啦)     // Note that SQL Server is accurate to 1/300th of millisecond 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); 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     return new System.Guid(guidArray); 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)//================================================================
    关于数据库主键和外键(终于弄懂啦)/// <summary>
    关于数据库主键和外键(终于弄懂啦)///  SQL SERVER 返回的 GUID 中生成时间信息
    关于数据库主键和外键(终于弄懂啦)/// </summary>
    关于数据库主键和外键(终于弄懂啦)/// <param name="guid">包含时间信息的 COMB </param>
    关于数据库主键和外键(终于弄懂啦)/// <returns>时间</returns>
    关于数据库主键和外键(终于弄懂啦)public static DateTime GetDateFromComb(System.Guid guid) 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     DateTime baseDate new DateTime(1900,1,1); 
    关于数据库主键和外键(终于弄懂啦)     byte[] daysArray new byte[4]; 
    关于数据库主键和外键(终于弄懂啦)     byte[] msecsArray new byte[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 ints 
    关于数据库主键和外键(终于弄懂啦)     int days BitConverter.ToInt32(daysArray, 0); 
    关于数据库主键和外键(终于弄懂啦)     int msecs BitConverter.ToInt32(msecsArray, 0); 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     DateTime date baseDate.AddDays(days); 
    关于数据库主键和外键(终于弄懂啦)     date date.AddMilliseconds(msecs 3.333333); 
    关于数据库主键和外键(终于弄懂啦)
    关于数据库主键和外键(终于弄懂啦)     return date; 

    关于数据库主键和外键(终于弄懂啦)} 

     

    展开全文
  • 主键和外键

    2020-10-14 19:14:44
    在同一个表中没有完全一致的两行数据, 当一行数据可以有少数几个属性确定的话,这几个属性就可以成为主键, 设立了表的主键之后,数据库系统会为主键的列建立索引制约, 利用主键进行检索的速度是最快的. 如果有两个...

    在关系型数据库中的每一个表都具备这样的特点, 在同一个表中没有完全一致的两行数据, 当一行数据可以有少数几个属性确定的话,这几个属性就可以成为主键, 设立了表的主键之后,数据库系统会为主键的列建立索引和制约, 利用主键进行检索的速度是最快的.
    如果有两个表AB, 他们之间存在着某种对应关系,这种关系可以是A中一行记录对应于B中的一行记录,也可以是A的一行记录对应于B的多行记录,还可以是A的多行对应于B的多行,在关系型数据库中, 这种对应关系也要做成关系表,下面就一对一, 一对多, 多对多几种情况来说明一下关系表
     

     

    一对一
    表A(学号, 姓名)
    表B(学号, 学习成绩)
    表A是一份学生名单, 学号是主键
    表B是一份成绩单, 学号也是主键,这样两个表就是一对一的关系, 反映出这一关系的是学号, 如果把表A做为主表的话, 表B的学号就是外键了

    一对多
    表A(班级, 人数)
    表B(学号, 姓名)
    表A是一份班级列表, 表B是一分学生名单,每个学生都属于某一个班级, 而一个班级可以有很多学生
    为了表示这样的关系, 可以做一个关系表C(学号,班级) 其中,学号是主键, 这就保证了一对多的关系, 而学号和班级, 都是外键, 由于B,C

    多对多
    表A(课程, 学分)
    表B(学号, 姓名)
    表A是一份课程表
    表B是份名单, 一个学生可以选多门课程,一门课程中也可以有很多学生, 为了反映这样的关系建立表C(课程,学号)其中课程和学号都是主键,这就保证了多对多的关系, 同时他们也是外键


    对外键的更新和删除, 也就有了下面两种制约
    - 级联, 当删除了主表的主键之后, 同时也删除关系表中的外键, 比如,删除了一对多的例子中删除了班级, 系统会自动删除关系表C中含有该班级的所有记录
    - 制约, 只有当关系表中没有与该主键对应的外键时才允许删除该主键,再比如, 在一对多的例子中, 想删除某一班级的话,就必须先删除关系表C中所有含该班级的记录

    建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

      指定主键关键字: foreign key(列名)

      引用外键关键字: references <外键表名>(外键列名)(被参考的表)

    事件触发限制: on delete和on update ,可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

      例如:

      outTable表 主键 id类型 int

      创建含有外键的表:

      create table temp(

      id int,

      name char(20),

      foreign key(id) references outTable(id) on delete cascade on update cascade);

      说明:把id列 设为外键 参照外表outTable的id列 当外键的值删除 本表中对应的列筛除 当外键的值改变 本表中对应的列值改变。

    展开全文
  • MySQL数据库 -- 主键和外键区别

    千次阅读 2020-02-17 16:43:38
    在一张课程表中, 有 " 课程编号, 课程名, 学分 " 3个属性, 而只有 "课程编号" 是唯一可以标识是哪门课程的, 因此将这张课程表的课程编号设置为 "主键" 而在一张学生成绩表当中, 单一一条属性是无...
  • MySql 主键和外键怎么使用?

    千次阅读 2020-07-30 22:12:20
    主键,是表中一列或者多列的组合,主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空,主键能够唯一的标识表中的每一条记录,可以结合外键来定义与不同数据表之间的关系。 怎么理解主键呢?...
  • Oracle的主键和外键

    2020-05-12 21:32:24
    文章目录一、表的主键二、表的外键1、外键的概念2、外键的作用3、外键约束4、创建外键5、删除外键6、示例脚本三、版权声明 一、表的主键 在现实世界中,很多数据具有唯一的特性,例如身份证号码,在国家人口基本信息...
  • 主键=主码:某个能够唯一标识一条... 作为一个可以被外键有效引用的对象。 主键约束: 表外添加 格式为: alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名) 例子: alter table student add
  • 主键和外键的定义

    2021-09-29 09:29:30
    主键(primary key):一列(或一组列),其值能够唯一区分表中每个行 。 外键(foreign key)外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系
  • 21.主键和外键区别是? A. 主键是表的唯一标识 B. 外键是关联从表的主键 C. 主键是从表的唯一标识 D. 外键是关联主表的主键 正确答案是:AB 数据库基础面试题-中级32题​​​​​​​ ...
  • 其中,主键和外键值得我们去了解。 在开始了解主键和外键之前,你肯定了解一些RDBMS术语,我们来做一个简单回顾: ***RDBMS相关术语:*** 数据库:数据库是一些关联表的集合。 数据表: 表是数据的矩阵。在一...
  • SQL的主键和外键

    2021-06-26 22:16:46
    1.定义主键和外键主要是为了维护关系数据库的完整性。 总结一下: ...2.主键外键和索引的区别? 3.数据库的主键外键等之间的关系 主键:一般情况下,满足第一范式的表都有一个主键Primary key,用于唯
  • SQL Server 数据完整性介绍,主键和外键介绍,数据类型介绍
  • 主要介绍了如何分清SQL数据库中的主键外键,这里简单介绍下,方便需要的朋友
  • [导读 ] 使用 MySQL 开发过数据库驱动的小型 web 应用程序的人都知道对关系数据库 的表进行创建 检索更新删除等操作都是些比较简单的过程 理论上 只要掌握了最常 见的 SQL 语句的用法并熟悉您选择使用的服务器端...
  • MySQL中主键外键区别和联系

    万次阅读 2017-03-31 10:04:14
    主键外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply 先说说主键主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是 thread.php?id=1 表示...
  • 1.3 主键外键和索引的区别 2.主键(primary key) 2.1 通过SSMS设置主键 2.2 通过SQL语句设置主键 3.外键(foreign key) 3.1 通过SSMS设置外键 3.2 通过SQL语句设置外键 4.SQL语句向已存在表设置主键和外键 4.1 ...
  • SQL的主键和外键详解!

    千次阅读 2020-11-07 11:52:04
    主键和外键 概念: SQL的主键表示唯一标识一条记录,不能有重复的,不允许为空。例如:一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 SQL的外键...
  • 2设置主键和外键

    2020-10-14 19:13:40
    表已经创建成功的情况,如何设置主键和外键:alter table 表名 add primary key(字段名); alter table 从表名 add constraint fk_xx_xx foreign key(外键字段名) references 主表名(主键);删除主键和外键alter table...
  • 主要介绍了MySQL中主键外键区别和联系,是MySQL入门学习中的基础知识,需要的朋友可以参考下
  • MySQL数据库的主键和外键详解

    千次阅读 2020-03-20 20:15:42
    MySQL数据库的主键和外键详解 主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 ...
  • 关系型数据库(例如mysql)中的一条记录中有若干个属性,若其中一个属性组(注意是组)能标识唯一一条记录,该属性组就可以称为一个...成绩表中的单一一个属性无法标识一条记录,学号课程号的组合才可以唯一标识...
  • 什么是主键和外键

    2020-07-19 16:01:31
    成绩表中单一一个属性无法唯一标识一条记录,学号课程号的组合才可以唯一标识一条记录,所以学号课程号的属性组是一个主键 成绩表中的学号不是成绩表的主键,但它学生表中的学号相对应,并且学生表中...
  • 数据库的主键和外键

    千次阅读 2019-07-03 15:49:56
    数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键...思考:主键带来了什么样的优点缺点? 外键也叫FOREIGN KEY,是用于将两个表链接在一起的键。 FOREIGN KEY...
  • 一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,117
精华内容 62,846
关键字:

主键和外键的区别