[英]how to make a composite foreign key (not composite primary key) as unique in 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種不同的方面/類/樣式。
如您所見,這些是2個完全相反的面。 我個人會推薦第一個,但是您可以自由選擇自己。 嘗試在數據庫中堅持單一樣式是很明智的。
在您提到的問題中,(客戶)將主鍵定義為郵政編碼。 現在,您將遇到郵政編碼無法唯一標識每一行的問題:結論:您的主鍵定義不正確。
解決方案:Rowland說了什么:使用代理密鑰(第一類),實際上您已經有了一個:PropertyID。 第二個選擇:在鍵中添加一個或多個字段,以便它將唯一地標識每一行,例如房屋/街道編號。
設置PrimaryKey的主要原因是使每個記錄都是唯一的。 就您而言,郵政編碼不是唯一的,我建議不要將其設置為PK。 相反,您可以創建代理密鑰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.