2014-04-13 19 views
0

我有以下MySQL的創建語句:MySQL的約束與鍵 - 和命名他們

CREATE TABLE `phppos_customers` (
    `person_id` int(10) NOT NULL, 
    `account_number` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `company_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `balance` decimal(23,10) NOT NULL DEFAULT '0.0000000000', 
    `taxable` int(1) NOT NULL DEFAULT '1', 
    `cc_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `cc_preview` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `card_issuer` varchar(255) COLLATE utf8_unicode_ci DEFAULT '', 
    `tier_id` int(10) DEFAULT NULL, 
    `deleted` int(1) NOT NULL DEFAULT '0', 
    UNIQUE KEY `account_number` (`account_number`), 
    KEY `person_id` (`person_id`), 
    KEY `deleted` (`deleted`), 
    KEY `cc_token` (`cc_token`), 
    KEY `phppos_customers_ibfk_2` (`tier_id`), 
    CONSTRAINT `phppos_customers_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `phppos_people` (`person_id`), 
    CONSTRAINT `phppos_customers_ibfk_2` FOREIGN KEY (`tier_id`) REFERENCES `phppos_price_tiers` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
/*!40101 SET character_set_client = @saved_cs_client */; 

在創建它似乎不會自動創建索引的約束,所以我創建了一個。這是真的? (我想我不知道我是否需要兩者)

它是否對名稱鍵造成任何傷害與約束相同?

我的理解是:

使用索引,以加快搜索

約束是用於確保數據的完整性(例如確保所有客戶指向一個人)

回答

2

一個FOREIGN KEY約束條件確實隱式定義列上的索引。因此,通過創建KEY (person_id)KEY (tier_id),您實際上在這些列上創建了兩個單獨的索引,這是多餘的。

您可以刪除兩個單獨定義的KEY s,並只是堅持FOREIGN KEY約束;這些約束將通過索引這些列來強制引用完整性。

如果執行DESCRIBE phppos_customers;,並檢查輸出,你應該看到指示燈MULKey領域上,您已經定義FOREIGN KEY約束,因爲他們確實索引的表列。

+0

好的謝謝你的信息 –