【问题标题】:Multiple column unique key allows multiple rows多列唯一键允许多行
【发布时间】:2012-03-14 06:06:49
【问题描述】:

我有一个 4 列的 MySQL 表

Column  Type        Null  Default
----------------------------------
id      int(11)     No    None     AUTO_INCREMENT
col1    int(11)     No    None
col2    int(11)     No    None
col3    varchar(20) Yes   Null

我已经用 col1、col2、col3 创建了一个索引,因为我不想要重复的行。我知道 NULL 值被认为是不同的,因此该表接受重复的行。

最好的选择是什么,这样我就可以拥有 col1、col2、col3 的唯一值的行?

【问题讨论】:

  • 您仍然会得到重复的 erow,因为空值不计入索引的唯一性决策。所以两个或多个带有(null, 1, 2) 的记录是完全可能的。

标签: mysql sql


【解决方案1】:

您可以在col3 上设置NOT NULL,并将默认值设置为''

【讨论】:

    【解决方案2】:

    我被教导理解 NULL 的方式是 NULL 是一个状态而不是一个值。因此,您实际上并没有与 NULL 不同的值。我实际上会考虑使用空白字符串而不是 NULL 或设置一些其他默认值。

    【讨论】:

      【解决方案3】:

      如果您希望数据库强制执行它,则没有那么多选择。由于您不能强制数据库考虑 NULL 除了 distinct 之外的任何内容;

      • 在列中使用空字符串而不是 NULL。只有当 "" 是一个有效值并且您希望它与实际的 NULL 值不同时,这才会造成麻烦。
      • 在列中使用空字符串而不是 NULL,并添加一个指示 NULL 值的布尔列。也将其添加到唯一索引中,数据库会将“假 NULL”与空字符串分开。

      这两个选项都要求您将 col3 设置为 NOT NULL 并在插入/选择时进行一些值映射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-19
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 2016-03-22
        • 2013-12-07
        相关资源
        最近更新 更多