簡體   English   中英

MySQL復合主鍵列順序不敏感

[英]MySQL Compound Primary Key Column-Order-Insensitivity

對於MySQL中的復合鍵,列的順序對於確保行的唯一性重要嗎?

例如

CREATE TABLE test (
    A  INT NOT NULL,
    B  INT NOT NULL,
    PRIMARY KEY (A, B)
);

現在,假設我已經有一行包含值A = 1,B = 2,MySQL會拒絕插入A = 2,B = 1的行嗎?

我問這個問題是因為我需要一個使用復合鍵並忽略值順序的解決方案。

不,唯一性無關緊要,僅對排序和訪問時間很重要

索引中的順序很重要。 為了提醒您順序為何重要,請考慮如果類型不兼容(例如datevarchar(255)會發生什么。 這些值不可互換。

如果您希望兩個值都唯一,那么您將需要添加一個觸發器。 觸發器可以實現更簡單的條件,這是A小於B的要求。 結合主鍵,可以保證兩個值的唯一性。 您可以在MySQL中表達此約束:

CONSTRAINT CHECK (A < B)

但是,可惜,MySQL將解析代碼,但不執行檢查。 相反,您可以在更新之前和插入觸發器之前添加,以將最小值放入A 這是一個例子:

CREATE TRIGGER table_beforeinsert BEFORE INSERT ON table
     FOR EACH ROW 
     BEGIN
         declare xx int;
         if (NEW.A > NEW.B) then
             set xx := NEW.A;
             set NEW.A = NEW.B;
             set NEW.B = xx;
         endif;
     END

哈哈不! 關鍵是屬性的組合。
不好意思,只是您知道...的價值
您的屬性是不同的A:1!= 2和B:2!= 1。
想象一下表中的行。
A | B
1 | 2
2 | 1

想象一下,例如字符串並置:“ 1:2”而“ 2:1”。
顯然,這些字符串不相等。
在內部,復合主鍵的表示將變得不那么瑣碎,當然,
適當地基於哈希函數,存儲在臨時存儲區中以進行查找
分為
基於范圍的頁面。

因此,重要的不是鍵中屬性的順序,而是
相應的列。
實際上,確定哪些屬性最適合用於化合物的過程
主鍵是一個非常有趣的鍵。
因此,您應該清楚地了解該過程,否則您可能會奇怪為什么會遇到
數據不一致。
以一個人的桌子為例:
名字,名字,生日,街道,城市,國家,州,郵編
實際上,這些屬性都不滿足唯一標識一個人的條件。
名稱和名字都沒有。
好吧,所以名字和名字,生日以及城市還不錯,但是看看
倫敦有多少名叫彼得·史密斯的人居住(可能位於GB或
安大略省,金田市)。
確定候選鍵的過程實際上就是定義屬性之間的功能依賴性的過程。
基本上,這個想法是:
如果我知道一個人的姓氏,我是否知道他的名字。
如果我知道一個人的姓氏和他的名字,我是否知道他住在哪個城市?
等等。
該函數依賴關系寫為:
城市,國家/地區-> zip //含義:當我認識一個人時,我知道他的郵編。
(當然,反之亦然)未出現在依賴項列表右側的屬性必須是每個候選鍵的一部分。
如果其他每個屬性都由該屬性確定,則說明您完成了。 你有你的
復合主鍵。
如果不:
然后,找到最佳候選密鑰的過程只是首先使用的步驟
由表中所有屬性組成的鍵。
然后刪除依賴的屬性。 列出所有候選密鑰並重復。
然后查看相似性(哪些候選關鍵字包含在其他候選關鍵字中,這稱為簡化)。
因此,您將獲得表的最佳復合主鍵。
作為第一種情況的示例:
屬性
A名,B名,C市,D州,E zip(國際)
E-> C //國際郵政編碼的格式例如為GB-W11 2BQ
E-> D
因此,第一個候選人是:
A,B,E(因為它們沒有出現在右側)。
其他屬性是否都取決於? 是的,只剩下C和D,它們取決於E
你完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM