mysql约束与键 - 并命名它们

时间:2014-04-13 01:44:23

标签: 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 */;

创建约束时,它似乎不会自动创建索引,因此我创建了一个索引。这是真的? (我想我不知道我是否需要两者)

它是否会对名称键造成任何伤害,与约束相同?

我的理解是:

索引用于加速搜索

约束用于确保数据完整性(例如,确保所有客户都指向某人)

1 个答案:

答案 0 :(得分:2)

FOREIGN KEY约束 隐式定义列上的索引。因此,通过创建KEY (person_id)KEY (tier_id),您实际上在这些列上创建了两个单独的索引,这是多余的。

您可以删除两个单独定义的KEY,并坚持使用FOREIGN KEY约束;约束将通过索引这些列来强制引用完整性。

如果执行DESCRIBE phppos_customers;并检查输出,您应该在MUL字段中看到已定义Key约束的表列的指示符FOREIGN KEY ,因为他们的确被编入索引。