数据库表中的主键有什么作用

数据库表中的主键有什么作用,第1张

数据主键

主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

作用:

1)保证实体的完整性;

2)加快数据库的 *** 作速度

3) 在表中添加新记录时,ACCESS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

4) ACCESS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

在有些数据库中,虽然主键不是必需的,但最好为每个表都设置一个主键,不管是单主键还是复合主键。它存在代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,以及本记录的修改与删除。

主键的无意义性

在开发过程中,读者可能会看到将一些表使用有意义的字段表示主键,例如“用户登录信息表”将“登录名”(英文名)作为主键,“订单表”中将“订单编号”作为主键,如此设计主键一般都是没什么问题,因为将这些主键基本不具有“意义更改”的可能性。但是,也有一些例外的情况,例如“订单表”需要支持需求“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,那将“订单编号”作为主键就满足不了要求了。因此读者在使用具有实际意义的字段作为主键时,需要考虑是否存在这种可能性。

主键的选择

①编号作主键

此方法就是采用实际业务中的唯一字段的“编号”作为主键设计,这在小型的项目中是推荐这样做的,因为这可以使项目比较简单化,但在使用中却可能带来一些麻烦,比如要进行“编号修改”时,可能要涉及到很多相关联的其他表,就像黎叔说的“后果很严重”;还有就是上面提到的“业务要求允许编号重复时”,我们再那么先知,都无法知道业务将会修改成什么

②自动编号主键

这种方法也是很多朋友在使用的,就是新建一个ID字段,自动增长,非常方便也满足主键的原则,优点是:数据库自动编号,速度快,而且是增量增长,聚集型主键按顺序存放,对于检索非常有利;数字型的,占用空间小,易排序,在程序中传递也方便;如果通过非系统增加记录(比如手动录入,或是用其他工具直接在表里插入新记录,或老系统数据导入)时,非常方便,不用担心主键重复问题。

缺点:其实缺点也就是来自其优点,就是因为自动增长,在手动要插入指定ID的记录时会显得麻烦,尤其是当系统与其他系统集成时,需要数据导入时,很难保证原系统的ID不发生主键冲突(前提是老系统也是数字型的);如果其他系统主键不是数字型那就麻烦更大了,会导致修改主键数据类型了,这也会导致其他相关表的修改,后果同样很严重;就算其他系统也是数字型的,在导入时,为了区分新老数据,可能想在老数据主键前统一加一个“o”(old)来表示这是老数据,那么自动增长的数字型又面临一个挑战。

思路:

取得2个表的存储过程、视图、触发器的脚本(同名的取其一?)

取的表名,把其他1个库的数据插入进来

不过写起来够麻烦,

另外可以用DMO模拟合并复制,没有做过,没有把握。

不可以!\x0d\ \x0d\如果两个主键名称相同说明不了什么的,我们还有一个词叫值域相同,也就是说两者必须是相同的类似与长度。也就是说外建表中的外键值域必须与主键表的主键值域相同。这才是外键约束的最关键部分。\x0d\ \x0d\如果两者来源于同一值域,那么有可能两者可能组合成为同一张表。也就是说AB两表合并,使用同一个foo那么并没有改变函数的依赖关系。所以两表合一,在关系中还是可以合关的。所以可以考虑两表合并。\x0d\ \x0d\但在关系设计后的并不十分完美,即便是我们不违反任何关系范式。因为在表设计中还有一类称为稀疏表与值域依赖关系。而你的问题合并后可能遭遇稀疏表的问题,其实稀疏表也也是一种值域依赖。它会导致大量的冗余数据的。\x0d\ \x0d\比如,比如在某些系统中,所有一会员均可登陆,但只有部分会员在拥有该系统的银行账号(银行系统独立开发)。那么,银行系统中规则所有会员最多只能有一个账号,并且账号名称与登陆名称值域相同。那么两表实际上是1:1的关系,有些书上说所有1:1的关系可转人为一张表。那么,我们就会遇到很多账户的用户——造成大量空间的浪费!这就是为什么很多1:1表不能合并的原因,事实上如果合并后,两者可以设计成相同的值域的,虽然合并后两者还是同样没有改变任何函数依赖,但事实上这种空间的极大浪费却是无可避免的,那么不合并的情况下,银行系统中的账户主键同是为登陆用户的主键的外键时,两者构造了1:1关系。但不会导致大量的冗余数据的存在。不少书上虽不赞成1:1关系转化为一张表,但却没有说出任何原因——另外一些纯粹是误导,所有1;1关系增可转换为一张表。\x0d\ \x0d\当然有时我们为了提高数据库运算效率,而对表进行了垂直拆分(也就是说,一个表将主键和部分属性,而另一个表为主键和另一部分属性)。这种方式常见于表中部分数据最常用,而另一部分不常用,那么,我们将属性按常用与不常用拆成两个表。这种情况下,一般用于两者独立性很强的场所,不要有很多地方对其再连接还原,因为链接是很耗时的 *** 作。这种设计规则还是可以存在的。但这时往往会给一些“善于”思考的读者留一个疑问!这拆分的两个表能不能主键互相做另一个表的外键呢?\x0d\ \x0d\我不知道这些“善于”思考者的心理是怎么想的——但是我知道这是完全无必要的。因为你既然想建立如此关系,就是相同步删除或插入而已,防止出现只删除了一个表中的数据而另一个表会留下无意义的数据——事实上这种情况是存在的!氢如果两者主键又同时互为外键时,就可做到同步——嗯,相法不错!\x0d\ \x0d\但是如果你这种同步对于你来说非常重要——那么当初你不应该拆表!或者说你当初应该选择水平拆表的办法(多表结构相同,存储不同的记录),否则干嘛费那事?但如果你想两者兼顾——我只能告诉你,你太“善于”思考了——以致于象这种天方夜谈都想出来了!\x0d\ \x0d\事实上是不可以了!从原理上来看,如果数据允许你这么设计,那么,你在删除时你准备删除那条数据?A表中的?还是B表中的,如果你删除A表中的,那么,它做为一个主键,那么你必须要先删除B表中的外键,在为数据库在检查时必须先删除外键数据记录,然后才会删除主键。要不数据库会出现一个不知在何处存在的外键了!是的,数据库会替您先删除B表中的主键的。这与你A表删除多么相似啊?要想删除B表,那么B的外键所指示的A表主键同样得先删除吧——这个循环怪圈你永远跳不出去!所以无法级联删除!\x0d\ \x0d\显然同样的问题会出现在插入上,你准备在A表中插入一条记录,因为A表中的主键也是外键,想插入?那么麻烦您先插入B表中的一条数据吧,B表想插入?那么它和A表插入的情况又有何不同呢?所以你根本无法插入一条数据!\x0d\ \x0d\太开玩笑了——如果我不设置删除时检查和插入时检查不就可以了?事实上更新检查又何尝试不是呢——如果更新检查也不设置呢?\x0d\ \x0d\那么——我就想不起来你建这个外键约束还有何必要了!建一个约束,然后这个约束力不让生效,这是做何道理呢?\x0d\ \x0d\所以,主键互为外键——从理论上来讲,你认为有任何的必要性么?

这个是不可能的。Sequense是严格的序列号,除非被循环了。同时并发的要求SEQ,数据库的锁机制会将用户排队,保证获得的序列是不一样的数字。

检查你的程序吧,程序的主键必然不是严格通过SEQ获得的

数据库合并的两类主要是:水平合并和垂直合并。

水平合并(Horizontal Merge)

水平合并也称为联合 *** 作(Union),是指将两个或多个具有相同结构的表中的记录合并到一个新表中。在合并时,每个表中的记录数不变,而字段数增加。数据源可以来自同一个库中的不同表或不同库中的相同结构的表。水平合并是在数据库应用程序中最常见的类型。

垂直合并(Vertical Merge)

垂直合并也称为叠加 *** 作(Join), 是指将每个表的记录中不同的字段抽取出来,再组合为一个新表。垂直合并通常需要在两个或多个表之间建立关联关系。

在实际应用中,水平合并和垂直合并可以灵活使用。例如,可以将多个部门的员工表进行水平合并来生成一份全公司的员工表,也可以使用垂直合并将部门表和员工表进行关联,生成一个包含员工所属部门信息的新表。需要根据具体情况和需求进行选择。

这个的话,原理很简单,只是工作处理比较烦琐:

主要步骤:将fat32格式上的整个数据库备份成bak备份文件,然后拿这个bak文件到NTFS格式的服务器上恢复。

恢复完后,然后用下面命令将一个文件中的所有数据从指定文件中迁移到同一文件组中的其它文件中,接着使用 ALTER DATABASE 语句除去文件(若要清掉多个数据文件,则重复这步 *** 作即可---先移除文件里面的数据,再删除该文件)。

以下 *** 作在查询分析器上执行即可:

--转到要处理的数据库:

use 库名

go

--查看该库所有的文件:

select [name],[filename] from sysfiles

go

--对指定的文件进行数据移除:

dbcc shrinkfile (上面查询得到的“逻辑文件名”(即Name那列), EMPTYFILE)

go

--将一定移除了数据的指定文件删除:

ALTER DATABASE 库名 REMOVE FILE 上面查询得到的“逻辑文件名”

go

on duplicate key update

格式:insert into 表名(字段1,字段2)values  (值1,值2) on duplicate key update 字段=新值;

作用:1、有唯一索引或主键冲突的数据插入时,只执行update后面的语句,更新指定字段的值

2、当无冲突数据插入时,就直接插入

例子:

insert into idoxu(id,stu_id,c_name) values (2,2,"huhu"),(7,7,"aha") on duplicate  key update c_name="huhu2";

执行后

replace

作用:1、有唯一索引或主键冲突的数据插入时,将删除以前的老数据,插入新的数据。如果新插入的数据中字段不全,则设为默认值,无默认值则为null(例子中istester字段,grade字段都设定了默认值为60)

2、当无冲突数据插入时,就直接插入(跟on duplicate  key update 一致)

replace into idoxu(id,stu_id,c_name) values (2,2,"huhu_replace"),(8,8,"enheng");

更新前:

执行后:

解决第16天0412作业(造数据 ,把istester表的所有数据,插入到 idoxu表)

使用on duplicate key update

insert into idoxu(id,stu_id,c_name) select id,id,uname from istester on duplicate key update c_name="new";

执行后

使用replace into

replace into idoxu(id,stu_id,c_name) select id,id,uname from istester;

执行后

以上就是关于数据库表中的主键有什么作用全部的内容,包括:数据库表中的主键有什么作用、2个sql数据库如何合并、两个表主键相同,这两个表的主键是否互为对方的外键等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10157978.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存