【问题标题】:Using two columns as primary key. Can I keep one column empty?使用两列作为主键。我可以保留一栏为空吗?
【发布时间】:2021-11-14 19:23:45
【问题描述】:

我有一个要求,我需要根据两列唯一标识一行。

 nType | dType | severity
------+-------+----------
  down | 6500 | CRITICAL

nTypedType 的组合应该始终是唯一的。所以,我创建了一个表使用

CREATE TABLE IF NOT EXISTS severitymapping(nType text, dType text, severity text, 
PRIMARY KEY (nType, dType);

但可能有 dType 为空的情况。所以,这对于我的业务逻辑来说也是独一无二的。但数据库不允许数据库中的 dType 为空/空值。

有没有办法做到这一点?

【问题讨论】:

  • 我会非常小心使用两个 Text 列作为您的主键,因为这也是您的集群键,它不是一个好的候选者,除非它是一个很少的小表写道(这很可能是基于描述)。您最好添加代理自动增量列作为主键,然后在 ntype 和 dtype 上定义唯一约束。 Example on db-fiddle

标签: mysql cassandra


【解决方案1】:

仅适用于 MySQL(问题带有 MySQL 标记)。


主键表达式不能包含 NULLable 列。

如果您需要某个列值为 NULL(不是“空” - SQL 中没有这样的术语),那么您不能创建包含该列的 PRIMARY 键。但是您可以创建唯一索引 - 它允许 NULL。在这种情况下,您需要在另一个表达式中作为主键 - 自动增量合成 PK 是合理的。

此外,每列的数据类型必须合理 - 显示的值和 TEXT 数据类型不匹配。 nType 的 VARCHAR 和 dType 的 INT 看起来更合适。

如果没有指定索引前缀长度,则不能在索引中使用 TEXT 列。

所以使用接近的东西

CREATE TABLE IF NOT EXISTS severitymapping(
    nType VARCHAR(255), 
    dType INT, 
    severity TEXT, 
    UNIQUE (nType, dType),
    id INT AUTO_INCREMENT PRIMARY KEY
);

【讨论】:

    【解决方案2】:

    Cassandra 的主键中的任何列都不能有 null 或空值。

    分区键 (nType) 唯一标识分区,其哈希值决定了存储分区的节点。

    集群键 (dType) 唯一标识分区中的一行。没有它,就不可能在分区中存储该行,因为没有集群键就无法检索该行。干杯!

    【讨论】:

      【解决方案3】:

      在您的情况下,您将 nType 作为分区键,将 dType 作为集群键。

      Cassandra 不允许空聚类键值。

      如果您出于某种原因确实需要“无值”,请使用空字符串或其他一些特殊的文字值(例如 'UNDEFINED')将它们聚集在一起。

      这个question也可以帮助你。

      【讨论】:

        猜你喜欢
        • 2018-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2012-06-29
        • 2014-07-17
        • 2021-03-27
        相关资源
        最近更新 更多