Sql 是否可以更新记录中与where子句中使用的字段相同的字段
我知道这个问题听起来不现实,下面是我试图做的一段代码Sql 是否可以更新记录中与where子句中使用的字段相同的字段,sql,Sql,我知道这个问题听起来不现实,下面是我试图做的一段代码 UPDATE Players SET PlayerID = 100, Name = 'L. Messi', PlayerWebsite = 'www.messi.com' WHERE (PlayerID = 43) 看,我正在尝试更新一个值,我已经在where子句中使用了这个值 我知道这根本没有道理!但是,如果我想这样做,有没有一种可能的方法或技巧呢?如果这是可能的,你认为这是坏习惯还是会引起问题 提前感谢=) 编辑 如果我之
UPDATE Players
SET PlayerID = 100, Name = 'L. Messi', PlayerWebsite = 'www.messi.com'
WHERE (PlayerID = 43)
看,我正在尝试更新一个值,我已经在where子句中使用了这个值
我知道这根本没有道理!但是,如果我想这样做,有没有一种可能的方法或技巧呢?如果这是可能的,你认为这是坏习惯还是会引起问题
提前感谢=)
编辑
如果我之前不清楚,我很抱歉,但此查询不运行是的,这就是正确的方式。这种方法一直在使用,例如,用于乐观并发。where子句在更新记录之前验证每个字段是否具有预期值。如果在您第一次检索记录和保存更改之间有其他人编辑了记录,则不会更新任何记录。从技术上讲,这是可能的,但更改主键(
PlayerID
是您的PK,我打赌)是一种奇怪的做法。您不需要技巧就可以做到这一点。这是允许的,您的代码应该可以工作
但是,如果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
列,您需要使用一些技巧来绕过它:
或者您不能将其设置为
标识
我相信这是可能的,但在ID字段上执行此操作肯定是不好的做法,除非您正在执行一次性迁移操作。如果其他表依赖PlayerId,否则不会。它确实依赖于其他表,其他表也依赖于它,但我不能只指定“更新时”要做什么吗?如果它是主键,则无法更新标识列“PlayerID”-那么您永远不应该更改它,这是主键的一部分。id不存在,但列id会自动递增,这就是问题所在吗-因为我的查询不运行,所以它不是一次性的,虽然很少使用,但它只是我想添加的一个高级选项…顺便说一句,它与其他表连接,但我可以指定“更新时”执行什么操作吗?