如何使主键不是唯一的MySQL

时间:2013-11-05 12:11:21

标签: mysql

我知道主键应该是唯一的。 但我正在为地产代理商创建一个数据库,其中邮政编码是地址表的主键。但是,如果一个房产是出售/出租,并且它在一个公寓楼,许多房产将有相同的邮政编码。 如何在保持PostCode作为PK的同时使其成为Uniqe? 谢谢你

到目前为止我的代码:

CREATE TABLE `Properties` (
  `PropertyID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `Property Type` varchar(20) NOT NULL,
  `PostCode` varchar(8) NOT NULL,
  `Bedrooms` tinyint(2) DEFAULT NULL,
  `Bathrooms` tinyint(2) DEFAULT NULL,
  `Ensuite` tinyint(1) DEFAULT NULL,
  `Kitchen` tinytext,
  `LivingRoom` tinytext,
  `DiningRoom` tinytext,
  `UtilityRoom` tinytext,
  `Conservatory` tinytext,
  `Garage` tinytext,
  `Garden` tinytext,
  `Furnished` tinytext,
  `Type` char(15) NOT NULL,
  PRIMARY KEY (`PropertyID`),
  KEY `Property Type` (`Property Type`),
  KEY `PostCode` (`PostCode`),
  CONSTRAINT `Properties_ibfk_2` FOREIGN KEY (`PostCode`) REFERENCES `Address` (`PostCode`),
  CONSTRAINT `Properties_ibfk_1` FOREIGN KEY (`Property Type`) REFERENCES `PropertyType` (`Property Type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1





 CREATE TABLE `Address` (
      `PostCode` varchar(8) NOT NULL,
      `HouseN` text NOT NULL,
      `AddL1` varchar(25) NOT NULL,
      `AddL2` varchar(25) DEFAULT NULL,
      `AddL3` varchar(25) DEFAULT NULL,
      `County` char(20) NOT NULL,
      PRIMARY KEY (`PostCode`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

3 个答案:

答案 0 :(得分:8)

主键是唯一的定义;更好的方法是拥有代理键​​(如自动编号值)或覆盖多列的复合键,例如邮政编码和属性名称/编号。

请注意,某些国家/地区(如英国)的邮政编码可能会随着时间的推移而发生变化;因此,我主张代理关键方法。

答案 1 :(得分:5)

在数据库设计中,有2个不同的边/类/样式。

  1. 第一种风格说主键应该是 虚拟的东西,如自动增量整数或guid。不 现实世界中存在的东西,其原因在于 现实世界中的一切都可以改变。
  2. 第二种风格说你应该只包含数据 你的表确实存在,主键由什么组成 客户说唯一标识一个表。
  3. 如你所见,这些是完全相反的两面。我个人会推荐第一个,但你可以自由选择自己。尝试在数据库中坚持一种风格是一件很聪明的事情。

    在您提到的问题中,主键(由客户)定义为邮政编码。您现在可以解决邮政编码无法唯一标识每一行的问题:结论:您的主键定义不正确。

    解决方案:Rowland说:要么使用代理键(第一类),实际上你已经拥有一个:PropertyID。 第二个选项:在键中添加一个字段/字段,以便它唯一地标识每一行,例如房屋/街道号。

答案 2 :(得分:0)

设置主键的主要原因是使每条记录都是唯一的。在您的情况下,邮政编码不是唯一的,我建议不要将其设置为PK。相反,你可以做一个代理键。