Sql 添加一个新列并使其成为表中的主键可以破坏现有代码吗

Sql 添加一个新列并使其成为表中的主键可以破坏现有代码吗,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,使用遗留系统时,许多表没有主键。DB是MSSQL server 2008,DB是几年前从foxpro迁移过来的 我想在没有PK的情况下将PK添加到表中,但我得到了回退,“因为它可能会破坏某些东西。” 尽管我尽了最大努力,但我想不出会发生这种情况的现实情况。推开的人也不能给我举个例子,他们只是想“安全”。安全会导致不作为,导致不必要的工作。不管怎样,有人能给我一个现实的场景吗?在这个场景中,现有的.net代码可能会出现问题?或者确认它不会破坏现有代码 添加PK的理由是能够使用实体框架生成DAL。一

使用遗留系统时,许多表没有主键。DB是MSSQL server 2008,DB是几年前从foxpro迁移过来的

我想在没有PK的情况下将PK添加到表中,但我得到了回退,“因为它可能会破坏某些东西。”

尽管我尽了最大努力,但我想不出会发生这种情况的现实情况。推开的人也不能给我举个例子,他们只是想“安全”。安全会导致不作为,导致不必要的工作。不管怎样,有人能给我一个现实的场景吗?在这个场景中,现有的.net代码可能会出现问题?或者确认它不会破坏现有代码


添加PK的理由是能够使用实体框架生成DAL。一些没有合适PK的表存在问题。也许我应该问一下在现有表中添加新列的风险是什么?但是,对其中一些表经常这样做,没有问题。

没有保证

我可以想象的一个方面是SELECT*语句和代码,它们期望以特定顺序返回一定数量的列。添加一个列,不管是不是PK,都可能破坏这一点


但是为了PK而添加PK并不能真正增加价值。PK有助于CRUD(特别是UD部件:),因此您必须更改代码以利用这一点。

使用较低的环境,进行所需的主键更改,并全面测试应用程序。我能想到的唯一一个答案与@n8wrl的答案相同

如果您的旧应用程序使用它所拉取的字段的名称,您应该不会有问题。如果你的应用程序使用say:
myDataReader(0).toString()


如果您可以确保添加的字段是表中的最后一个字段,那么我想即使这样也会有所缓解。我知道你的感受,但你的团队使用的是“S**T发生”论点。弄乱主键是有风险的。您还需要问问自己,公司中是否有其他应用程序依赖此数据库。我会说“要非常小心,做好备份”。从理论上讲,我看不出有什么理由不能做到这一点

如果选择自动递增这些新创建的主键中的任何一个,则可能会遇到标识插入问题

尽管我不愿意帮助您使用Entity Framework,但我必须说,如果您检查了该列以确保没有空值和重复项,那么可以将其声明为PK。添加新列的风险更大,但将现有列作为PK应该相当简单,坦率地说,如果结果出现任何问题(即,当您不需要任何列时,它试图插入一个副本),那么这是很好的,因为如果该列应该是唯一的,如果有什么东西试图使其不唯一,那么它就是一个bug

然而,您的公司需要的是清楚地了解如何成功地重构数据库,这样他们就不会觉得这是不可能的。我强烈建议你阅读,检索数据库
Ambler和Sadalage。(). 有一些方法可以降低数据库重构的风险

不知道我是怎么得到这家伙的两份拷贝的-试着编辑,最后得到了两份!当你说主键时,你的意思是在你要声明为主键的字段上当前没有唯一的索引吗?或者,这样的索引已经存在了吗?我有两个基本的场景。1) 现有的列可以做成PK,目前不是自动递增的,就这样离开了,列没有唯一性或空值的问题。2) 不存在合适的列,请添加列,使其自动递增。索引将是下一步:(还应该提到,添加的列将转到现有字段的末尾,而不改变序号位置。如果某些列被用作PKs(即唯一的,可能从其他地方引用,如外键),那么添加唯一索引应该不是问题。我不认为添加新的生成/自动增量PK字段有任何好处,而且它伴随着任何字段添加带来的风险,也伴随着非键添加字段可能不会出现的额外问题。您认为在没有人要使用PK字段的情况下添加此类字段有什么好处吗g他们?编辑了关于原因的问题。主要原因是能够使用EF生成DAL。是的,某些字段用作FK,但未指定为FK(在todo列表上).我们还计划在某种程度上对数据库进行规范化。目前至少有一个表的列数为+150且不断增长,这可能会从规范化中受益。但首先我想修复PK,FK。我觉得这是一个什么都不做的借口。PK阻止了实体框架的轻松使用。生成DAL后,我必须对它进行按摩才能让它工作。我希望能够生成DAL而不必“修复”它。宽表(超过23列)没有PK是一个令人悲伤的原因。这应该不是问题。当我将现有列设置为PK时,我不会使其自动递增。我会允许它继续按原样填充。当前列必须可用作PK,没有空列,没有重复列。这本书已订购。