2017-04-01 95 views
1

我有以下表:最佳實踐以更新EAV錶行

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

一個屬性可以有多個值(在上表中的多個出現爲相同的屬性)。 對於相同屬性(不同值)的出現次數沒有限制。

我wan't更新與SubjectID = 1的主題,到VALUEID更改爲僅1在屬性Id爲1,因此

前:

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

後:

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 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

我不確定這會起作用。更新不限於一行。從示例主題 - 屬性 - 值1,1,3和1,1,2中都將更新爲1,1,1。刪除將找不到任何記錄。這將使OP有2條記錄,而不是請求的1. –

+0

您可以通過CTE [限制更新](http://stackoverflow.com/questions/3860975/sql-update-top1-row-query)設置爲行數。 –

+0

不,它只更新一行,試試吧! – IngoB

1

使用set rowcount is deprecated,使用top (n)代替。

重要

使用SET ROWCOUNT將不會影響DELETE,INSERT,並且在未來的SQL Server版本UPDATE語句。避免在新的開發工作中使用SET ROWCOUNT和DELETE,INSERT和UPDATE語句,並計劃修改當前使用它的應用程序。對於類似的行爲,使用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 | 
+-----------+-------------+---------+