【问题标题】:UNIQUE KEY with one null field具有一个空字段的 UNIQUE KEY
【发布时间】:2015-05-20 03:06:01
【问题描述】:

我有下表:

- territory_id
- platform_id
- title_id (NULLable)
- collection_id (NULLable)

以下是我在表格中的一些值:

1 - ('US', 'ITUNES', 1, NULL)
2 - ('US', 'ITUNES', 1, NULL)
3 - ('US', 'ITUNES', NULL, 1)

1 和 2 是重复的,不应同时允许。但是,使用上述四个字段的外键:

ALTER TABLE pricing ADD UNIQUE KEY (territory_id, platform_id, title_id, collection_id)

它仍然允许我插入它,很可能是因为如果其中一个字段为空,它会忽略完整性检查。有没有办法在不创建两个唯一键的情况下解决这个问题,(territory_id, platform_id, title_id)(territory_id, platform_id, colletion_id)

【问题讨论】:

  • 它没有忽略完整性检查,NULL 值不被视为彼此相等。是的,有时这很烦人,但据我所知,没有办法告诉 MySQL 将 NULL 视为相同的 UNIQUE 约束。此外,两个唯一键实际上并不等效,尽管它们可能为您服务。 (US, ITUNES, 1, 1) 是应该能够与您的第一个值示例一起存在的记录吗?

标签: mysql


【解决方案1】:

这是一个MySQL bug不是一个错误。

一些解决方法:

  1. 将所有字段设置为 NOT NULL 并使用一些特殊值来表示 NULL,将其设置为默认值,然后让您的程序识别该值。 Hacky 且容易出错。

  2. 我猜 title_id 和 collection_id FK 的东西。如果该表中有空值,则可以插入该 ID 并避免出现空值。我喜欢这个,但如果空 ID 很重要,可能就不合适了。

  3. 也许你可以以某种方式使用triggers。你可以在一个动作之前触发一个触发器,这样你就可以在插入之前检查表,如果行存在就不要插入,或者做其他事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2012-03-01
    • 2013-01-12
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多