更新密钥的一部分

时间:2011-05-17 12:04:55

标签: sql sql-server database crud

问:

例如,如果我有4个字段组合的复合键,我可以更新其中一个吗?

我的意思是我可以执行这样的声明:

UPDATE tb 
SET firstCol = '15', secondCol = 'test2' 
WHERE firstCol = '1' AND serial = '2';

假设:

  • 我的表名是:tb
  • 我的字段是:firstCol, secondCol, serial
  • 我的钥匙是:firstCol , serial

有什么建议吗?我错过了一些概念吗?

感谢。

3 个答案:

答案 0 :(得分:4)

当然你可以这样做,为什么? 你有这个问题吗?

答案 1 :(得分:3)

是的,你可以。它可能是关键的一部分,但它仍然是一个专栏。

注意:如果你有FK依赖这个密钥,那么你需要考虑CASCASE更新。此外,密钥更新(假设其已聚集)意味着更多工作然后“正常”,因为非聚簇索引如何引用聚簇密钥

答案 2 :(得分:3)

如果尝试将某些行设置为与现有行相同的值,则可能会在更新时遇到问题。无论您在更新中执行什么操作,唯一约束仍将适用。

如果您有相关的表并且已启用级联更新,则可能会在需要锁定许多记录时出现锁定问题。如果您没有启用级联更新,则可能会遇到以下问题:在您破坏这些关系之后无法更改PK,然后在将所有相关表手动更改为新值后将其重新放回。无论哪种方式,此任务只应在非高峰时段以单用户模式完成。

就个人而言,如果您需要更改PK,数据库的设计很脆弱,将来可能会出现问题。特别是使用多列密钥。如果这是一次性的罕见变更,请继续解决问题。否则,可能是时候确定是否具有代理键作为PK并且多列上的唯一索引是更好的选择。多列PK不仅在主表上创建了更大的索引,而且还创建了子表,当您需要更新其中一列时,它们可能会产生难题,并且它们对连接具有性能影响。一般来说,我不是他们的粉丝。并且如果有一些列需要以任何频率进行更新(并且我的意思是每年多次更新一次 - 一两个记录可以,但是如果您正在运行更新,如上所述每年一次,你需要重新审视我认为的设计。)

相关问题