【问题标题】:Two column primary key in MySQLMySQL中的两列主键
【发布时间】:2008-12-05 01:04:55
【问题描述】:

我有一个非常简单的问题和一个可行的解决方案,但我正在寻找一个更简单的解决方案。

当多个值等于现有值时,我想防止将行添加到数据库中。例如,如果 a2=a1 AND b2=b1 则数据将被拒绝。如果仅 a2=a1 或仅 b2=b1 则允许。基本上我希望它像主键一样需要两个值匹配。

我知道我可以在写入数据库之前通过验证来做到这一点——例如。选择 * where a='a2' and b='b2' 然后在我得到结果时避免写入新数据。我宁愿做的是启用一个 MySQL 设置,比如主键,它会自动阻止这样的数据。

除了基本功能之外,我对 MySQL 不是很熟悉,如果这太简单了,我深表歉意。谷歌搜索有关唯一索引和主键的各种信息并没有帮助。

【问题讨论】:

    标签: mysql indexing constraints


    【解决方案1】:

    为您希望唯一的列创建唯一索引。

    例如:

    CREATE UNIQUE INDEX index_name ON table(col1, col2);
    

    请参阅 MySQL Create index manual

    【讨论】:

      【解决方案2】:

      您希望在创建表(或更改现有表)时使用 MySQL CONSTRAINT 语法。

      【讨论】:

        【解决方案3】:

        除了 gcores 所说的之外,我想补充一点,您的替代建议是在应用程序层进行验证,这是一件坏事。如果两个应用程序试图插入相同的数据,并且它们是交错的,会发生什么?他们可能都检查,看到数据不存在,然后都插入。如果使用唯一索引,有两个好处:

        • 用户不必再检查该值是否存在。他们只是尝试操作,如果失败,则表示该值已经存在。这会稍微减少数据库的负载,并使应用程序逻辑更简单。
        • 数据库将始终有效,因为它自己执行规则。当您可以推断出硬性规则时,使用数据库会容易得多,而不是“我们预计不会有重复,但技术上可能......”这样的废话。

        【讨论】:

          猜你喜欢
          • 2011-07-21
          • 1970-01-01
          • 2011-02-08
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          相关资源
          最近更新 更多