在用户界面中,我显示的是account_id
和account_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)
答案 0 :(得分:3)
account_id
和user_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_id
和account_id
。这是因为受更新影响的所有行(由WHERE
子句确定)都会一次更新。