2011-11-17 2 views
0

UI에서 나는 account_idaccount_name을 표시하고 있습니다.
사용자는 account_name뿐만 아니라 account_name도 업데이트 할 수 있으며 account_id는 해당 사용자에 대해 고유합니다. 사용자가 account_id (복합 키)를 업데이트 할 수있게 허용하고 있으므로 업데이트를 수행하는 동안 where 절을 어떻게 만들 수 있습니까?SQL : 복합 키를 업데이트하는 방법?

다음은 저의 테이블 디자인입니다.

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

이 기능은 작동하지 않지만 공유하거나 표시하지 않는 장면 뒤에는 변경할 수없는 키가 있습니다. 외래 키 관계 및 복합 키 부분에 대한 업데이트로 인한 문제점을 제거합니다.IE는 필드 (AccountID 인 PK를 추가하고 FK 관계에 사용됨. – xQbert

+0

@OMGPonies 오라클 ... – james007

+0

일부 사료를 생각해보기 : http://programmers.stackexchange.com/questions/8187/should-a- primary-key-be-immutable – xQbert

답변

3

account_iduser_id 값이 남아있다.

따라서. 시작되는 경우 으로 시작하여 account_id 20으로 시작하고 account_id을 30으로 변경합니다.

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

당신이 당신의 복합 키의 모든 값을 유지하는 상황에서 위의 작품, 내가 공유하거나 표시 않습니다 배후 불변의 키에 대한 모든이야 있지만. 외래 키 관계 및 복합 키 부분에 대한 업데이트 문제를 제거합니다. 이를 구현하려면 PK이고 FK 관계에 사용되는 필드 (AccountID)를 추가하십시오.

또는 Oracle은 ROWSCN을 사용하고 모든 테이블에서 상태가없는 환경의 행 종속성을 사용하여 이와 유사한 작업을 수행 할 수 있습니다. AccountID가 다중 사용자 환경에서 person 1에게 레코드 1을 수정하고 사용자 2가 레코드 1을 편집하고 저장하도록하는 것이 가능한 경우에만 사용할 수있는 문제입니다. 사용자 1의 업데이트를 덮어 씁니다. 이것이 ROWSCN과 ROWDEPENDENCIES에 대한 이유입니다. 그러나 당신이 국가를 인식하는 환경에 있다면, 이것은 과도 할 것입니다.

마지막으로 클래스를 업데이트하기 전에 데이터베이스 업데이트를 실행하기 위해 작업 순서를 변경할 수 있습니다. 이 방법을 사용하면 두 가지 값을 모두 가질 수 있습니다.

+0

나는 뒤에서 불변의 열쇠를 갖는 당신의 해결책을 좋아합니다 ... 당신의 대답을 당신의 대답 부분에 분명히하십시오 ... – james007

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

분명히 이것은 당신이 UPDATE를 발행 할 때까지 (새로운 것들과는 별도로) 원래 USER_ID 및 ACCOUNT_ID을 추적 할 필요합니다.

웹 앱 (특히) 인 경우 사용자가이 프로세스를 두 번 연속으로 실행하는 경우를 고려해야합니다.

또는 Oracle의 RowID을 참조하십시오. 이를 PK 컬럼 대신 WHERE 절에서 사용할 수 있습니다.

+0

업데이트 계정 설정 account_id = 'dummy2'user_id = 'user1'및 account_id = 'accountid'. UI의 account_id를 변경 했으므로 비즈니스 계층에서 where 절을 형성하기 위해 이전 account_id가 없습니다 ... – james007

+0

GUI에서 숨겨진 필드로 복합 키를 추적합니다. 또는 클래스를 확장하여 복합 키의 값을 유지해야 where 절을 작성할 수 있습니다. – xQbert

+0

@ james007 행을 어떻게 든 식별하는 방법을 추적해야합니다. 그 주위에는 방법이 없습니다. – mjwills

0

이 시도 : 당신이 그들을 변경할 때까지

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

나는 account_id를 변경하고 있기 때문에 old_account_id를 유지하지 않습니다. 필요할 경우 테이블 디자인을 변경할 정도로 유연합니다 .... old_values를 추적해야합니까? – james007

+0

원래 계정 ID가 어딘가에 저장되어 있어야하며 그렇지 않으면 레코드를 어떻게 찾을 수 있습니까? 나는 단지 검색 키에 대한 이전 계정 ID를 사용하는 것이 좋습니다 ... – Sparky

+0

그는 그가 DB를 업데이 트하기 전에 정보를 포함하는 클래스를 덮어 쓰는 것을 의미한다고 생각합니다. 대체 옵션은 클래스를 업데이트하기 전에 데이터베이스에 대한 UPDATE를 수행하는 것입니다. – xQbert

0

SQL에서 작업 단위 (UOW)는 컬럼이 아닌 행입니다.

이제 실제로이 실행되지만 것을 생각하지 않는다 :

UPDATE accounts 
    SET user_id = account_id, 
     account_id = user_id ; 

성공적으로 모든 사용자에 대해 user_idaccount_id을 교환한다. 업데이트로 영향을받는 모든 행 (WHERE 절로 결정됨)이 한꺼번에 업데이트되기 때문입니다.

관련 문제