我有以下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 */;
创建约束时,它似乎不会自动创建索引,因此我创建了一个索引。这是真的? (我想我不知道我是否需要两者)
它是否会对名称键造成任何伤害,与约束相同?
我的理解是:
索引用于加速搜索
约束用于确保数据完整性(例如,确保所有客户都指向某人)
答案 0 :(得分:2)
FOREIGN KEY
约束 隐式定义列上的索引。因此,通过创建KEY (person_id)
和KEY (tier_id)
,您实际上在这些列上创建了两个单独的索引,这是多余的。
您可以删除两个单独定义的KEY
,并坚持使用FOREIGN KEY
约束;约束将通过索引这些列来强制引用完整性。
如果执行DESCRIBE phppos_customers;
并检查输出,您应该在MUL
字段中看到已定义Key
约束的表列的指示符FOREIGN KEY
,因为他们的确被编入索引。