SQL数据库中的主键与外键介绍

1.什么是主键和外键:在关系数据库中,一条记录有多个属性。
例如:学生表(学号、姓名、性别、班级)是每个学生的学号表,学号是主表用户(用户名、密码、登录级别)是用户名表,用户名是主电脑记录表是(卡号、学号、姓名)、流水号)电脑记录表没有属性。
为了唯一标识一条记录,学号和姓名的组合可以唯一标识一条记录,因此学号和姓名标签组的主键不是班级表的主键,即计算机记录中的标签号。
,但是和学生表中的主键是一样的,并且学生表中的学号是学生表的主键,那么班级表中的学号就说是学生表的外键。
主键是可以标识一条记录的唯一标识符。
ID号对于您来说是唯一的,并且可能会重复。
外键用匹配另一个表。
它是标识另一个表的记录的字段,用于维护数据的一致性。
例如,如果A表中的某个字段是B表的主键,则它可以是A表的外键。
2、主键、外键、索引有什么区别?定义:一条记录​​不能唯一标识可能为空用于与其他表建立关系只能有一个主键一个外键表可以有多个唯一索引,和非聚集索引有什么区别?聚集索引必须是唯一索引。
但特殊索引不一定是存储索引。
聚集索引将数据直接存储在索引页上,非聚集索引将索引存储在索引页上,这些索引引用单独数据页上的数据。
3、数据库中主键和外键的设计原则主键和外键是将多个表组织成有效的关系数据库的粘合剂。
主键和外键的设计对物理数据库的性能和可用性具有至关重要的影响。
数据库的设计必须从理论逻辑设计转变为实际物理设计。
主键和外键的结构是这个设计过程的核心。
设计好的数据库在生产环境中使用后,这些键将很难更改,因此在开发阶段设置主键和外键非常重要和有用。
主键:关系数据库基于主键——它们是数据库物理设计的基石。
在物理层面,主键只有两个目的:1.唯一标识行。
2.它是一个可以有效地被外键引用的对象。
基于以上两种用途,我在创建物理主键时遵循以下一些原则:1、主键对于用户来说应该是无意义的。
如果用户看到代表多对多关系的联接表中的数据并抱怨它没有用,则证明主键设计得很好。
2、提高混合、过滤作业效率的主要关键应是一塔。
注意:使用组合键的人通常会因为两个原因而欺骗自己,这两个原因都是错误的。
一是主键必须有有效的含义,但让主键有意义只是人为地破坏数据库。
第二种是使用此方法在定义多对多关系的连接表上使用两个外键作为主键。
也就是说,当你连接表时,成为另一个从表的主表,根据上面的第二种方法,就会成为这个表的主键的一部分。
后来的从站变成一个表,主键包含附加列。
3.切勿更新主密钥。
正确,因为主键除了唯一标识行之外没有其他用途,因此没有理由更新它。
如果必须更新主密钥,就违反了主密钥必须对用户无意义的原则。
注:这个原则需要在数据转换或者多库集成的时候整理不适用于数据。
4、主键不应包含时间戳、创建时间列、修改时间列等变量。
5、主密钥必须由计算机自动生成。
如果有人干扰主键的创建,那么这将意味着除了唯一标识该行之外的其他事情。
一旦跨越这个边界,可能就会有修改主键的动机,因此这个系统用来链接和管理记录行的关键方法就落入了那些不懂数据库设计的人手中。
4.数据库主键选择策略我们需要为每个表定义一个主键,但可以有多个候选索引。
由于主键可以唯一标识行记录,因此可以保证更新和删除数据时不会出现错误。
当然,其他字段可以帮助我们在做这些事件时避免共享,但这里不会讨论它们。
除了上述功能外,主键还使用外键创建引用完整性约束,以防止数据不一致。
因此,主键在数据库设计中起着非常重要的作用。
常见的数据库键选择方法包括:•自动增长字段•手动增长字段•唯一标识符•“COMB”类型1自动增长字段许多数据库设计者喜欢使用自动增长字段,因为它们易于使用。
自动字段允许我们添加到数据库中而不管主键的值是什么,数据库系统确保不存在重复。
如果我们使用的是SQLServer数据库,我们可以使用@@Identity全局变量来获取记录插入后系统分配的主键值。
虽然自增字段为我们省去了很多费力的工作,但是使用它可能会遇到问题,那就是在数据库模式下,很难预先填充主键和外键值。

假设有两个表:Order(OrderID,OrderDate)OrderDetial(OrderID,LineNum,ProductID,Price)OrderID是Orders表中的自动填充字段。
现在我们需要输入一个订单,包括在Order表中插入一条记录和在OrderDetail表中插入多条记录。
订单表中的订单ID自动递增由于它是一个字段,因此在正式输入数据库之前我们无法知道记录的值。
这会导致以下冲突:首先,要向OrderDtail字段添加正确的值,必须更新订单表以找到系统分配的OrderID的值,然后使用此OrderID进行填充。
订单清单表。
最后,更新OderDetail表。
但为了保证数据一致性,Order和OrderDetail必须在事务保护下同时更新,即两张表必须同时更新成功。
它们似乎是矛盾的。
另外,当我们需要在多个数据库之间复制数据时(SQLServer的数据分发和订阅机制允许我们在数据库之间复制数据),自增字段会在数据集成时造成较大的冲突。
想象一下,当一个数据库中的订单表复制到另一个数据库中的订单表时,应该自动添加OrderID吗?ADO.NET允许我们将数据集中的特定字段设置为自增字段,但请记住,这个自增字段只是一个占位符,当数据库更新时,数据库生成的值将自动替换ADONET分配的值。
因此,为了防止用户混淆,建议在ADO.NET中将初始值和增量设置为-1。
另外,在ADO.NET中,我们可以为两张表建立DataRelation,这样当两张表以级联关系更新时,一张表更新后,另一张表对应的键值也自动改变,这是一种自动在两个具有动态关系的表之间进行更新时的开发将大大减少该问题。
2、因为自动开发字段会导致这样的问题,所以我们也可以使用手动开发字段,这意味着我们自己维护主键值通常需要创建一个单独的表来存储当前的主键值。
使用上面的示例,这次我们创建一个名为IntKey的新表,其中包含两个字段,KeyName和KeyValue。
和HashTable一样,给定一个键名,你可以找出当前的键值是什么,并手动添加键值数据。
您可以编写这样的存储过程来在SQLServer中自动获取键值。
代码如下:CREATEPROCEDURE[GetKey]@KeyNamechar(10),@KeyValueintOUTPUTASUPDATEIntKeySET@KeyValue=KeyValue=KeyValue+1WHEREKeyName=@KeyNameGO这样我们就可以通过调用存储过程来获取该键值。
它不会是重复的。
如果OrderID字段设置为手动开发字段,则程序可以按如下步骤执行:首先调用存储过程获取OrderID,然后用这个OrderID填充Order表和OrderDetail表,最后比较二。
更新事务保护下的表。
当使用手动递增的字段作为主键在数据库之间复制数据时,只要我们为不同的数据库分配单独的主键值类,就可以确保数据集成过程中不会丢失任何键值。
但使用手工种植的字段会增加网络的往返次数。
这种方法有很大的缺点。
同时,还需要考虑各种情况,例如并行冲突,这增加了系统的复杂性。
3使用UniqueIdentifierSQLServer为我们提供了唯一标识符息类型,并使用NEWID()生成唯一标识符。
唯一标识符在数据库中占用16字节,由于重复的概率很小,所以可以算为0。
我们经常在注册表中看到类似{45F0EB02-0727-4F2E-AAB5-E8AEDEE0CEC5}的内容。
.NET中的唯一标识符称为GUID(GlobalUniqueIdentifier)。
要在C#中生成GUID,可以使用以下命令:Guidu=System.Guid.NewGuid();对于上面的命令和系统列表程序,如果选择UniqueIdentifier作为主键,我们就可以完全删除上面的内容。
添加网络往返问题。
GUID由程序自动生成来填充主键,无论是否存在重复。
唯一标识符字段也有严重的缺点:首先,它有16个字节长,比整数长4倍,占用大量存储空间。
最令人担忧的是UniqueIdentifier的生成是不标准的,并且在其上创建索引是一项耗时的操作(大多数数据库在主键上都有索引)。
有人做过实验,在输入相同量的数据时,使用UniqueIdentifier类型数据作为主键比使用Integer类型数据慢,所以为了效率起见,使用UniqueIdentifier类型数据作为主键值。
尽可能避免使用它。
4.使用“COMB(组合)”类型。
答案是肯定的。
通过使用COMB类型(数据库中没有COMB类型,它是由JimmyNielsen在他的文章“GUIDsasPrimaryKeys”中设计的),您可以在三者之间找到一个很好的平衡。
COMB数据类型的基本设计思想是这样的:我们可以保留唯一标识符的前10个字节组合,因为唯一标识符数据由于损坏而影响系统性能,索引效率较低。
最后6个字节表示GUID的创建时间(日期时间),因此我们将时间信息与唯一标识符结合起来以保持其唯一性。
有些人可能担心将UniqueIdentifier减少到10字节会导致数据重复。
生成的两个GUID的前10个字节相同是1/300秒,这几乎是不可能的!在SQLServer中使用SQL命令来实现这个想法:DECLARE@aGuidUNIQUEIDENTIFIERSET@aGuid=CAST(CAST(NEWID()ASBINARY(10))+CAST(GETDATE()ASBINARY(6))ASUNIQUEIDENTIFIER)经过测试,使用COMB作为primarykey仍然比使用INT作为主键进行检索、插入、更新、删除等操作慢,但比索引类型快。
以上是SQL数据库中主键和外键的简单介绍,如有出入,敬请谅解!

什么是主键和外键?

主键和外键是关系数据库中的两个关键概念,用于保证数据的唯一性和完整性。
主键(PrimaryKey)是一个属性或属性集,用于唯一标识表中的每条记录,以确保其值唯一且非空。
例如,学生表中的学号和用户表中的用户名都是主键,因为它们可以确保每个学生或用户的身份是唯一的。
外键(ForeignKey)包括两个表之间的链接。
它是一个列,其值来自另一个表的主键。
例如,订单表中的订单ID可以是与订单详细信息表中的主键相关联的外键。
设置外键有助于保持数据一致性,当排名表中的数据被删除时,外键会自动删除相关的明细数据,避免数据冗余。
如果一组属性可以通过组合其他属性来唯一标识一条记录,即使单个属性不能,那么该组合可以成为主键。
主键表是指具有主键的表,而外键表是指将主键表的列引用为其他表中的外键的表。
在SQL中,通过定义主键和外键,可以创建表之间的关系,以保证数据的一致性和完整性。

数据库的主键和外键

数据库主键是指一列或列的组合,其值唯一标识表中的每一行,通过它可以强制表的实体完整性。
主键主要用于其他表的外键关联以及这条记录的修改和删除。
外键,也称为外键。
外键代表两个关系之间的关系。
外键主要用于控制外键表中存储的数据或连接两个表。
外键只能引用表中列的值,也可以使用空值。
主键和外键的区别:1.从定义上来说:主键唯一标识一条记录,不能重复,不允许为空,外键可以重复并且可以减为零2.在。
字;作用:主键主要用于保证数据完整性;外键主要用于与其他表建立连接。
3、从数量上看:一张表只能有一个主键;