sql-server - 更新 EAV 表行的最佳实践

标签 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 个则不是一个好的解决方案)

还有其他想法吗?

最佳答案

您可以只更新一行,然后像这样删除其他行:

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;

关于sql-server - 更新 EAV 表行的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153661/

相关文章:

sql - 防止 SQL 数据库中的数据欺诈和删除

database - 实现基于图的数据库

sql - '! =' and ' <>' postgresql 中的运算符

MySQL:表中的批量更新

mysql - CASE 对于 mysql 中的多个更新实际上有用吗?

sql - 根据列值生成行

php - 如何在 `ms-sql-server` 容器中执行命令?

mysql - 从数据库中删除用户的所有记录

mysql - 使用输入中的常量值更新列字段累积和

sql - 从一个表插入另一个表并激活触发器