一条依赖于 sql db 中所有其他表记录的记录
Posted
技术标签:
【中文标题】一条依赖于 sql db 中所有其他表记录的记录【英文标题】:A record that depends on all other table records in sql db 【发布时间】:2015-12-14 06:55:05 【问题描述】:假设我有一个像这样的货币表:
表格 is_main 列包含有关将哪种货币视为“主要货币”的信息。表格必须包含一种主要货币,但不能超过一种。 是否有一种优雅的方法可以在 sql db 本身(在本例中为 H2)或 使用(java)应用层处理会更好吗?
Andy 提出的answer 用于:“当列y 不等于0 时应唯一的x 列”。 我会将需求定义为:“当所有其他 x 记录都等于 0 时,应该是唯一的列 x” 甚至更好:“当 col x 为 1 时,将所有其他 x 记录设置为 0” 我更喜欢通用的 sql 解决方案,而不是特定的 H2 数据库解决方案。
【问题讨论】:
Conditional Unique index on h2 database的可能重复 我不确定它是否重复。当我有多个值为 0 的记录(其中 !is_main )时,我看不到如何使用 unique 你读过我链接的帖子吗?是否清楚地说明了那里的 条件 唯一索引:“当列y
不等于 0 时应该是唯一的列 x
” - 这正是你的情况。
是的,我当然读过。它可以帮助我寻找我需要的东西。使用您建议的术语,我将需求定义为:“当所有其他 x 记录等于 0 时,列 x 应该是唯一的”甚至更好:**“当 col x 为 1 时,将所有其他 x 记录设置为 0”
@OferYuval 如果我理解正确,the other answer 和你的问题之间的区别是你也想要强制至少总是一种主要货币? Here's a duplicate on dba.se.
【参考方案1】:
我实际上会将主要货币保存在这样的第二张表中:
create table settings (key char(255), val char(255)).
您可以在其中存储一个键值对,例如 main_currency='USD' 等。然后,您可以进行查询,例如
select * from currencies left join settings where settings.val=currencies.iso_name and settings.key='main_currency'
【讨论】:
感谢@John Trash,这就是我现在正在做的事情,但我想尝试将它们全部放在一张桌子上。 但是为什么呢?实际上,当您将一整列用于仅一个元组的信息时,您会浪费大量空间(在逻辑方面比实际内存更多)。这在数据库设计中通常是个坏主意。 很高兴知道。谢谢您,我会考虑到这一点,并可能保留设计原样。 +1【参考方案2】:例如,默认货币的 ISO 名称使用小写字母。或所有其他的大写和小写。它将被排序在顶部。
【讨论】:
这并不能解决问题,它只是添加了一个新问题。现在您需要确保只有一个名称是小写的,并且您拥有一种名称格式不同的货币。以上是关于一条依赖于 sql db 中所有其他表记录的记录的主要内容,如果未能解决你的问题,请参考以下文章
表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]
如何确保仅从特定表中选择第一条记录,该表可以在 DB2 中包含多个相同 ID 的记录