让我们看两个表:
CREATE TABLE `orders_products` (
`ORDER_ID` int(10) unsigned NOT NULL,
`PRODUCT_ID` int(10) unsigned NOT NULL,
`QUANTITY` tinyint(3) unsigned NOT NULL,
`USER_ID` int(10) unsigned NOT NULL,
PRIMARY KEY (`ORDER_ID`,`PRODUCT_ID`,`USER_ID`) USING BTREE,
KEY `FK_orders_products_3` (`USER_ID`),
KEY `FK_orders_products_2` (`PRODUCT_ID`) **USING BTREE**,
CONSTRAINT `FK_orders_products_1` FOREIGN KEY (`ORDER_ID`) REFERENCES `orders` (`ID`) ON DELETE CASCADE,
CONSTRAINT `FK_orders_products_2` FOREIGN KEY (`PRODUCT_ID`) REFERENCES `products` (`ID`) ON DELETE CASCADE,
CONSTRAINT `FK_orders_products_3` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
另一个:
CREATE TABLE `products_pictures_comments` (
`PICTURE_ID` int(10) unsigned NOT NULL,
`USER_ID` int(10) unsigned NOT NULL,
`COMMENT` text NOT NULL,
`DATEAT` datetime NOT NULL,
PRIMARY KEY (`PICTURE_ID`,`USER_ID`,`DATEAT`),
KEY `FK_products_pictures_comments_2` (`USER_ID`),
CONSTRAINT `FK_products_pictures_comments_1` FOREIGN KEY (`PICTURE_ID`) REFERENCES `products_pictures` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_products_pictures_comments_2` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如您所见,由于未知原因出现了 USING BTREE。我用 show index from
命令检查了表,所有的 Index_type 都显示为 BTREE。但它只出现在 FK_orders_products_2 外键中。为什么?
编辑:这些表定义是由 SHOW CREATE TABLE 生成的!
最佳答案
首先,我想提一下,BTREE 是 MYSQL 中大多数存储引擎的默认索引类型。我可以看到您在这两个语句中都使用了 InnoDB 存储引擎,尽管您没有指定关键字,但 BTREE 是 innodb 存储引擎中索引的默认类型。
我非常确定您在创建表orders_products时可能保留了“USING BTREE”关键字,这会导致“USING BTREE”包含在由SHOW CREATE TABLE生成的DDL脚本中。
--------------实验--------------
删除表 zzz_test1;
删除表 zzz_test2;
创建表 zzz_test1(id INT, NAME VARCHAR(50), PRIMARY KEY(id) 使用 BTREE);
创建表 zzz_test2(id INT, NAME VARCHAR(50), PRIMARY KEY(id));
显示创建表 zzz_test1;
------------输出--------------
创建表zzz_test1
(
id
INT(11) NOT NULL DEFAULT '0',
名称
VARCHAR(50) 默认为 NULL,
使用 BTREE 的主键 (id
)
) ENGINE=INNODB 默认字符集=latin1
显示创建表 zzz_test2;
------------输出--------------
创建表zzz_test2
(
id
INT(11) NOT NULL DEFAULT '0',
NAME
VARCHAR(50) 默认为 NULL,
主键(id
)
) ENGINE=INNODB 默认字符集=latin1
关于MySQL:为什么索引列标记为 "BTREE?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814650/