【问题标题】:Can mySQL define specific columns as UNIQUE based on another column?mySQL 可以根据另一列将特定列定义为 UNIQUE 吗?
【发布时间】:2011-08-05 15:47:57
【问题描述】:

假设我有一张桌子:

  CREATE TABLE `ml_vendor_refs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ml_id` int(11) NOT NULL,
  `ven_id` int(11) NOT NULL,
  `designator` int(4) NOT NULL,
  `telco` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

如您所见,“id”是主要和 AI。但是,我希望能够根据“ml_id”和“telco”的父级添加几行不重复的“指定符”。 例如:

"id"    "ml_id" "ven_id"    "designator"    "telco"
"1"     "5144"    "3"            "1"           "0"
"2"     "5144"    "7"            "2"           "0"
"3"     "5144"    "44"           "3"           "0"
"4"     "5144"    "49"           "4"           "0"

对于“ml_id”和布尔“telco”的每个实例,我希望能够拥有唯一且唯一的“指示符”。有意义吗?

谢谢

【问题讨论】:

  • 因此,您可以将 designator 两次设为 1,但 ml_idtelco 的值不同。那是对的吗?在这种情况下,您可以跨 3 列添加唯一索引 dev.mysql.com/doc/refman/5.0/en/create-index.html
  • @Brendan - 回答这个问题,以便我们投票!

标签: mysql constraints unique


【解决方案1】:

你可以有一个UNIQUE 索引而不是跨越多个列。结果将是一个限制,即相同的值可以在一个列中出现多次,但相同的值组合不能出现在指定的列中。

CREATE TABLE `ml_vendor_refs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ml_id` int(11) NOT NULL,
  `ven_id` int(11) NOT NULL,
  `designator` int(4) NOT NULL,
  `telco` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `designators` (`designator`,`ml_id`,`telco`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

【讨论】:

    【解决方案2】:
    UNIQUE( ml_id, telco, designator )
    

    【讨论】:

      【解决方案3】:

      如果您在多个列上添加唯一索引,则可以定义唯一配对。例如,您可以在 ml_id, designator 上添加一个索引,强制配对是唯一的。

      据我所知,NULL 值不受唯一约束。

      【讨论】:

      • 在这种情况下,所有列都已指定为NOT NULL,但对于唯一索引,这一点值得记住
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多