是否可以更新记录中与where子句中使用的字段相同的字段

时间:2010-12-16 01:22:58

标签: sql

我知道这个问题听起来并不现实,而且这是我试图做的一段代码。

UPDATE    Players
SET PlayerID = 100, Name = 'L. Messi', PlayerWebsite = 'www.messi.com'
WHERE     (PlayerID = 43)

看,我试图更新一个我已经在where子句中使用过的值 我知道它甚至没有意义!但如果我想这样做,是否有可能的方法或种类的伎俩呢?如果这是可能的,你认为这是不好的做法还是会导致问题?

提前致谢=)

修改 如果我以前不清楚,我很抱歉,但这个查询还没有运行

4 个答案:

答案 0 :(得分:2)

你不需要一个技巧来做到这一点。它是允许的,你的代码应该可以工作。

如果ID列是一个键,如果ID已经存在,则无法进行。

要查看列是否为键,请尝试运行以下命令:

SELECT K.TABLE_NAME,
K.COLUMN_NAME,
K.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON C.TABLE_NAME = K.TABLE_NAME
AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND K.COLUMN_NAME = 'PlayerID';

如果返回一行,则它是主键,您需要在更新记录之前检查您要更改的ID是否存在。

修改 由于它是IDENTITY列,您需要使用一些技巧来解决它: http://blogs.3sharp.com/deving/archive/2005/11/04/971.aspx

或者您无法将其设为IDENTITY

答案 1 :(得分:1)

是的,这是确切的方式。此方法始终使用,例如,用于乐观并发。 where子句在更新记录之前验证每个字段是否具有预期值。如果其他人在您第一次检索记录和保存更改之间编辑了记录,则不会更新任何记录。

答案 2 :(得分:0)

从技术上讲,这是可能的,但更改主键(PlayerID是你的PK,我打赌)是一种奇怪的做法。

答案 3 :(得分:0)

我认为这是可能的,但在 ID 字段上专门执行此操作绝对是不好的做法,除非您正在进行一次性迁移。