1

를 업데이트하는 나는 다음과 같은 테이블이 있습니다모범 사례는 EAV 테이블 행

SubjectID AttributeID ValueID 
1   1   2 
1   1   3 
1   2   1 
2   1   3 
2   2   1 
1   3   1 

속성은 (동일한 속성에 대해 위의 표에서 여러 모습) 여러 값을 가질 수 있습니다. 동일한 속성 (다른 값)에 대해 얼마나 많은 모양이 사용되는지에 대한 제약이 없습니다.

Select * from Subject WHERE SubjectID=1 AND AttributeID=1 
--returns: 
SubjectID AttributeID ValueID 
1   1   2 
1   1   3 

후 :

나는 그렇게

하기 전에, 단 1 AttributeId에 1 곳으로 ValueID을 변경, SubjectID = 1 주제를 업데이트 할 wan't

Select * from Subject WHERE SubjectID=1 AND AttributeID=1 
--returns: 
SubjectID AttributeID ValueID 
1   1   1 

나는 선택적 매개 변수 (모두 null 및 제공된 속성 만 업데이트하십시오.) 이제는 문제가되지 않습니다. 내 질문 :

이 행을 업데이트하는 가장 좋은 방법은 무엇입니까? 다음 대답을 실행 가능한 것으로 봅니다.

  1. 지정된 속성이 포함 된 모든 행을 삭제 한 다음 새 속성을 삽입하십시오.
  2. (지정된 주제에 대한) 해당 유형의 하나의 속성을 업데이트 하나 (1이 아닌보다이 같은 속성이있는 경우 좋은 해결책)

다른 아이디어가 있다면?

+0

당신이 다른 곳에서 각 주제 속성 쌍에 대한 여러 값을 사용하고 있습니까? 그렇지 않다면, 나는 이것을 제거하고 재발생을 막기 위해 테이블 ​​디자인을 업데이트 할 것을 권한다. 이렇게하면이 테이블에서 작성한 모든 쿼리/SP가 단순 해집니다. 이러한 기록을 보관해야하는 경우 트랜잭션 내에서 삭제 한 다음 삽입합니다. –

+0

나는 정말로 선택의 여지가 없다. 거의 완성 된이 디자인을 구현해야만했다. o.O – berthos

답변

2

당신은 하나의 행을 업데이트 할 수 다음과 같이 다른 사람을 삭제 : set rowcount is deprecated를 사용

set rowcount 1; 

update Subject 
    set ValuedID = 1 
where SubjectID = 1 
    and AttributeID = 1; 

set rowcount 0; 

delete Subject 
where SubjectID = 1 
    and AttributeID = 1 
    and ValuedID <> 1; 
+0

나는 이것이 작동 할 지 모르겠다. 업데이트는 행에 국한되지 않습니다.Subject-Attribute-Value 1, 1, 3 및 1의 예제에서 1, 2가 모두 1, 1, 1로 업데이트됩니다. 삭제로 인해 레코드가 발견되지 않습니다. 이것은 요청 된 1 대신 OP를 2 개의 레코드로 남겨 둡니다. –

+0

CTE를 통해 [업데이트 제한] (http://stackoverflow.com/questions/3860975/sql-update-top1-row-query) 설정된 행 수까지. –

+0

아니요, 한 행만 업데이트하여 사용해보십시오! – IngoB

1

가 대신 top (n)를 사용합니다.

중요

SET의 ROWCOUNT를 사용하면, DELETE INSERT 및 SQL Server의 이후 버전에서 UPDATE 문에 영향을 미치지 않습니다. 새로운 개발 작업에서 DELETE, INSERT 및 UPDATE 문과 함께 SET ROWCOUNT를 사용하지 말고 현재 사용중인 응용 프로그램을 수정하십시오. 비슷한 동작을 위해 TOP 구문을 사용하십시오. 자세한 내용은 TOP (Transact-SQL)를 참조하십시오.


update top (1) Subject 
    set ValueID = 1 
where SubjectID = 1 
    and AttributeID = 1; 

delete Subject 
where SubjectID = 1 
    and AttributeID = 1 
    and ValueID <> 1; 

rextester 데모 : http://rextester.com/ATDKI87027

반환 :

+-----------+-------------+---------+ 
| SubjectID | AttributeID | ValueID | 
+-----------+-------------+---------+ 
|   1 |   1 |  1 | 
|   1 |   2 |  1 | 
|   2 |   1 |  3 | 
|   2 |   2 |  1 | 
|   1 |   3 |  1 | 
+-----------+-------------+---------+