【问题标题】:MySQL composite key to allow a single default recordMySQL 复合键允许单个默认记录
【发布时间】:2014-07-03 05:23:10
【问题描述】:

我有一张这样的桌子:

ID  UserID  Country IsDefault
1   7       90      0
2   7       93      0
3   7       95      1
4   7       88      0 

5   8       34      0
6   8       55      1
7   8       27      0
8   8       12      0

ID 是主键。 UserID 来自用户表。 CountryID 来自国家表。 IsDefault 显示哪些国家是用户的默认国家/地区。

是否可以只允许一个 isDefault = 1 用于使用复合键的 UserId? IE。 UserId = 7 的组合应该只有一个 IsDefault = 1 的实例。UserId 7 的所有其他实例都应该有 isDefault 0。UserId 8 也是如此,它应该只有一个默认国家/地区。

【问题讨论】:

  • 也许使用触发器?
  • 为什么不在用户表中将默认国家作为字段?
  • 你们是对的。但我很好奇是否可以添加这样的约束。

标签: mysql sql composite-key


【解决方案1】:

您要查找的内容称为部分索引(SQL 服务器中的过滤索引)但是 MySQL 不支持它们,即在另一个数据库中的以下内容(这不会在 MySQL 中工作)

CREATE UNIQUE INDEX yourIndexNameHere
ON yourTableNameHere (UserID) 
WHERE IsDefault=1;

您的选择如下

  1. 创建一个触发器以在可以处理唯一约束的 INSERT 和 UPDATE 语句之前执行,即将IsDefault 为该UserID 的所有其他行设置为 0(这可以优化,即忽略当前正在更新的行在 UPDATE 中,并且只更新 IsDefault 实际上是 1) (由 Fabricator 建议)
  2. 在存储此信息的用户表中添加一个DefaultCountry 列(根据 wils484 的建议)
  3. 使用与 MySQL 不同的数据库。 SQL Server、PostgreSQL 和 SQLite 能够支持部分索引

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2012-02-29
    • 2020-12-08
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多