繁体   English   中英

如何使主键不是唯一的MySQL

[英]How to make a Primary Key NOT UNIQUE MySQL

我知道主键应该是唯一的。 但是我正在为房地产代理创建一个数据库,其中邮政编码是地址表的主键。 但是,如果某物业用于出售/出租且位于一栋公寓楼中,则许多物业将具有相同的邮政编码。 在保持邮政编码为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

主键按定义是唯一的; 更好的方法是使用替代键(例如自动编号的值),或者使用包含多个列的复合键,例如邮政编码和属性名称/编号。

请注意,在某些国家(例如英国),给定物业的邮政编码可能会随时间而变化; 因此,我主张采用替代密钥方法。

在数据库设计中,有2种不同的方面/类/样式。

  1. 第一种风格表示主键应该是虚拟的,例如自动增量整数或guid。 现实世界中不存在某些东西,其原因是现实世界中的所有事物都可以改变。
  2. 第二种风格说,您应该只在确实存在的表中包括数据,而主键由客户端所说的唯一标识表的内容组成。

如您所见,这些是2个完全相反的面。 我个人会推荐第一个,但是您可以自由选择自己。 尝试在数据库中坚持单一样式是很明智的。

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

解决方案:Rowland说了什么:使用代理密钥(第一类),实际上您已经有了一个:PropertyID。 第二个选择:在键中添加一个或多个字段,以便它将唯一地标识每一行,例如房屋/街道编号。

设置PrimaryKey的主要原因是使每个记录都是唯一的。 就您而言,邮政编码不是唯一的,我建议不要将其设置为PK。 相反,您可以创建代理密钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM