SQL:如何更新组合键?

时间:2011-11-17 03:30:26

标签: sql oracle sql-update

在用户界面中,我显示的是account_idaccount_name 用户能够更新account_id以及account_name,并且account_id对于用户是唯一的。由于我允许用户更新account_id(复合键),如何在进行更新时创建where子句?

以下是我的桌面设计。

CREATE TABLE accounts (
  user_id      VARCHAR2(20)  NOT NULL,
  account_id   VARCHAR2(20)  NOT NULL, 
  account_name VARCHAR2(20)  NOT NULL
)

ALTER TABLE accounts ADD CONSTRAINT
uk_myTable_1 UNIQUE (User_id, account_id)

4 个答案:

答案 0 :(得分:3)

account_iduser_id值会一直保留,直到您更改它们为止。

因此。如果它以user_id 10开头account_id 20而您将account_id更改为30,例如

 UPDATE accounts 
    SET account_id = '30' 
  WHERE account_id = '20'
        AND user_id = '10';

虽然上述内容适用于您保留复合键的所有值的情况,但我完全是在幕后永远不会共享或显示的不可变键。它消除了外键关系和部分复合键更新的问题。要实现此功能,请添加一个字段(AccountID),该字段是PK,并在FK关系中使用。

或者,Oracle可以通过在所有表上使用ROWSCN和无状态环境中的行依赖性来执行类似的操作。如果只是AccountID,那么你可以遇到的问题是,在多用户环境中,可以让人更新记录1,用户2编辑记录1,然后保存;覆盖用户1的更新。因为这是我提到ROWSCN和ROWDEPENDENCIES的原因。但是,如果你处于一个有状态意识的环境中,那就太过分了。

最后,您可以在更新课程之前更改操作的顺序以执行对数据库的更新。这样你就有了这两个值。

答案 1 :(得分:0)

UPDATE accounts
SET whatevercolumnsyouwantasnormal
WHERE USER_ID = 'whatever' and ACCOUNT_ID = 'whatever2'

显然,这将要求您跟踪原始的USER_ID和ACCOUNT_ID(与新的分开),直到您发出更新。

如果这是一个Web应用程序(特别是),请务必考虑用户快速连续两次触发此过程的情况。

或者,查看Oracle的RowID。您可以在WHERE子句中使用它而不是PK列。

答案 2 :(得分:0)

试试这个:

UPDATE accounts SET account_id = New_account,account_name = new_name
WHERE user_id = Old_id and account_id = old_account_id

答案 3 :(得分:0)

SQL中的工作单元是行,而不是列。

现在不执行此操作,但考虑

UPDATE accounts 
   SET user_id = account_id, 
       account_id = user_id ;

会成功为所有用户交换user_idaccount_id。这是因为受更新影响的所有行(由WHERE子句确定)都会一次更新。