标签: enum

首先按某些枚举值排序

我有一个像这样的表:

\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91ID \xe2\x95\x91 type (enum)        \xe2\x95\x91 updated_at  \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1 \xe2\x95\x91 friend_request     \xe2\x95\x91 <date_time> \xe2\x95\x91\n\xe2\x95\x91 2 \xe2\x95\x91 new_article        \xe2\x95\x91 <date_time> \xe2\x95\x91\n\xe2\x95\x91 3 \xe2\x95\x91 article_read       \xe2\x95\x91 <date_time> \xe2\x95\x91\n\xe2\x95\x91 4 \xe2\x95\x91 article_invitation \xe2\x95\x91 <date_time> \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

我想按枚举类型的值对检索到的结果进行排序。

\n

具有值friend_requestarticle_invitation列的记录type应该首先出现,然后是其余的。所有的东西都应该由 订购updated_at DESC

\n

现在,我知道我可以链接多个order by属性,所以

\n
order by type desc, updated_at desc\n
Run Code Online (Sandbox Code Playgroud)\n

将为我排序,并按type值排序结果updated_at。但是如何指定列的某些值type呢?这可能吗?

\n

postgresql order-by enum

5
推荐指数
1
解决办法
7386
查看次数

定期查询 pg_type 以获取枚举是一种不好的做法吗?

在 Postgres 中,我正在考虑查询pg_type我经常使用的最新枚举列表。我会使用这样的东西:

SELECT pg_type.typname AS enum_type, pg_enum.enumlabel AS enmu_label FROM 
pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)

或者

SELECT distinct pg_type.typname AS enum_type FROM pg_type JOIN pg_enum ON 
pg_enum.enumtypid = pg_type.oid;
Run Code Online (Sandbox Code Playgroud)

这是不好的做法吗?

postgresql catalogs enum

3
推荐指数
1
解决办法
1161
查看次数

MariaDB 如何处理 FOREIGN KEY 约束中使用的 ENUM 类型?

紧接着这个问题,

如果引用表中的值ENUM比被引用表的值多或少,MySQL 如何工作?它是否仅基于全局ENUM文本密钥(符号)来验证完整性?还是底层的整数值?

mysql mariadb foreign-key enum

3
推荐指数
1
解决办法
1869
查看次数

如何利用自然键和代理键实现“两全其美”?DBMS 可以做得更好吗?

我正在设计我的第一个数据库,我发现自己对为分类变量的每个实例存储整数或字符串之间的选择感到沮丧。

我的理解是,如果我有一个包含城市的表,我想将其作为国家/地区表的子级,那么最有效的方法是将国家/地区表的 PK 作为城市表中的 FK。然而,为了便于使用和调试,最好始终将字符串名称与国家/地区 PK 相关联。我考虑过的每个解决方案要么不推荐,要么看起来过于复杂。

我想了解这些方法的优点(或了解新方法),并了解是否必须如此,或者数据库是否只是因为传统而如此。

可能的方法:

  1. 使用字符串作为国家/地区的 PK。然后我将在任何子表中为其提供一个人类可读的 FK。显然,性能不如使用整数,但我怀疑这可能是获得我想要的便利的最不糟糕的方法。

  2. 使用应用程序逻辑创建一个视图,将每个国家/地区的字符串名称连接到 states 表。

  • 我不喜欢这个,因为如果应用程序逻辑中断,表格的可读性就会降低。另外,我预计大型连接操作的性能损失会比字符串 PK/FK 更严重。
  1. 创建一个单独的表以将数字 ID 与相应的字符串 ID 连接起来。我不确定是否有一个表编码每种类型的关系会更好,或者一个大表有一个大的 ID 池来覆盖所有整数键字符串值关系。然后,我可以使用应用程序逻辑查找适当的字符串,并在用户给出字符串名称时将适当的 PK 填充到子表中。
  • 我觉得这也可能是相当资源密集型的,因为每次向子级添加新行时都必须进行查找。这也意味着我仍然需要创建我想要的视图。
  1. 使用enum数据类型。出于本能,这将是我的首选方法,因为它似乎是自然键和合成键之间的理想平衡:使用整数 ID 并为 ID 提供字符串标签,以便字符串本身不需要重复。
  • 不幸的是,我的研究发现不建议这样做。原因之一是类别不能轻易删除。我不确定这对我来说是否是一个破坏性的因素,但我也想知道为什么 DBMS 是这样设计的。难道分类变量的常用程度不足以为它们添加便利功能吗?

foreign-key primary-key surrogate-key enum natural-key

2
推荐指数
1
解决办法
892
查看次数

MySQL 枚举具有非直观行为,为什么?

这篇非常有用的文章解释了有关MySQL 枚举行为的一些奇怪之处:http : //melp.nl/2009/05/mysql-enums-and-booleans/

没有关于为什么存在这种行为的讨论。此外,在谷歌搜索这个主题时,我发现只有相互矛盾的信息和推测,由“博主”和其他盲人引导。

有人可以描述一下为什么 MySQL 枚举会遭受帖子中概述的行为。这是帖子中介绍的 Enum 奇怪之处的一个示例,但还有更多示例

mysql> insert into t values('1'),('0');
mysql> select b,b=1,b=0 from t;
+---+-----+-----+
| b | b=1 | b=0 |
+---+-----+-----+
| 1 |   0 |   0 |
| 0 |   1 |   0 |
+---+-----+-----+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

mysql enum

1
推荐指数
1
解决办法
174
查看次数