簡體   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