我有一个简单的表(我们称之为Table1),它有一个NVARCHAR字段作为PK。 Table1与任何其他表都没有关联。
当我使用LinqToSQL更新Table1的PK列时,它失败了。如果我更新其他列,则会成功。
我可以删除此行并在Table1中插入新行,但我不想这样做。有一个事务表,其中Table1的PK列为列。
当Table1的PK改变时,我想在事务表中没有效果。但是当删除Table1中的行时,我希望删除事务行。级联是通过触发器完成的。
由于这两个表之间没有关联,如果我使用普通SQL更新Table1的PK列,它可以工作,并且对事务表没有预期的影响。当我删除该行时,触发器将从事务表中删除行。
因此我无法在Table1中删除然后添加新行。那么如何才能成功更新Table1的PrimaryKey?
答案 0 :(得分:3)
正如Otavio所说,主键不应该更新。创建Int(或BigInt)类型的列,并使其成为自动编号主键。你的NVARCHAR字段可以简单地对它有一个唯一的约束,因为这是你真正想要的,因为该列不用于与其他表的关系。
更新
另请注意,当您将该列用作主键并将其与其他表关联时,您无法再更改它。 SQL Server会在您的脸上抛出UPDATE statement conflicted with COLUMN REFERENCE constraint
错误。
接下来还有其他更改主键的问题,例如:性能。更改主键将导致聚簇索引碎片。
答案 1 :(得分:2)
行的主键用于唯一标识一行(在LINQ to SQL的情况下,为对象)。
如果您正在修改主键,实际上您正在创建一个与另一个相同字段的新唯一对象。
我总是用新密钥复制原始对象,然后删除旧对象。它更清楚地表明意图并防止混淆。