更新EAV表行的最佳实践

时间:2017-04-01 06:38:06

标签: sql-server database sql-update rows entity-attribute-value

我有下表:

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

属性可以有多个值(上表中针对同一属性有多个外观)。 对同一属性(不同的值)的出现次数没有约束。

我不想使用SubjectID = 1更新主题,将ValueID更改为仅1,其中AttributeID为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,则不是一个好的解决方案)
  3. 还有其他想法吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

使用set rowcount is deprecated,改为使用"provided"

  

重要

  在将来的SQL Server发行版中,使用SET ROWCOUNT不会影响DELETE,INSERT和UPDATE语句。避免在新的开发工作中使用SET ROWCOUNT和DELETE,INSERT和UPDATE语句,并计划修改当前使用它的应用程序。对于类似的行为,请使用TOP语法。有关更多信息,请参阅TOP(Transact-SQL)。

top (n)

rextester演示:http://rextester.com/ATDKI87027

返回:

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

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