【问题标题】:Prevent Duplicate Entries Composite Index防止重复条目综合索引
【发布时间】:2017-08-09 23:59:52
【问题描述】:

我有一个 Relationships 表,我正在尝试将复合索引添加到:

CREATE UNIQUE INDEX idx_relationship_userid_friend_id on Relationships(user_id, friend_id);

我想防止 user_idfriend_id 列出现重复条目​​。即 user_id = 26 和 friend_id = 46 的第二个条目应该给出错误。

我运行了上面的命令。当我再次运行该命令时,出现以下错误: Duplicate entry '36-50' for key 'idx_relationship_userid_friend_id'

当我查看INDEXES 中的结构时,我看到了下表:

Create syntax 旁边的表格信息下,我有以下代码:

CREATE TABLE `Relationships` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `friend_id` int(11) DEFAULT NULL,
  `status` int(11) DEFAULT '1',
  `createdAt` datetime NOT NULL,
  `updatedAt` datetime NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `app_common` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `owner_id` (`user_id`),
  KEY `app_common` (`app_common`),
  CONSTRAINT `Relationships_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `Users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `Relationships_ibfk_2` FOREIGN KEY (`app_common`) REFERENCES `AppCommon` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=latin1;

但是,我可以在数据库中插入重复记录。

问题:如何避免重复输入?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    由于您的表已经有重复项,因此尝试创建索引时会出错,因此不会添加它。

    请参阅How to delete duplicates on a MySQL table? 了解如何删除重复项。完成后,您可以添加唯一索引以防止添加新的重复项。

    【讨论】:

    • 谢谢。我尝试运行以下命令,ALTER IGNORE TABLE Relationships ADD UNIQUE (user_id, friend_id)。我有一个错误。我相信这是因为该命令已被弃用。
    • 你是对的,它在 5.7 中被删除了。 dev.mysql.com/worklog/task/?id=7395。在添加索引之前,您需要使用其他方法来消除重复项。
    【解决方案2】:

    使用Unique 约束来处理您的问题,例如:

    CONSTRAINT UC_user_friend UNIQUE (user_id, friend_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多