我有一个包含单个唯一 VARCHAR(512) 字段的表。我想让另一个表保存对第一个表的外键引用。两个表都使用 InnoDB。
如果我向第二个表添加 VARCHAR(512) 键并在其上添加外键约束,512 字节长的数据是否会保存两次?
如果是这样,有没有办法只保存对索引的引用而不保存对 varchar 本身的引用?
简而言之,我的问题是,在 InnoDB 中是否有一种有效的方法来保存长 VARCHAR 字段的外键?
非常感谢,
Yaniv
我运行了一个简单的测试:创建 3 个表,一个用于保存数据本身,包含两列、ID (int) 和数据 (varchar[120]),另一个表使用 ID 作为外键,最后一个表使用数据作为外键:
CREATE TABLE `dados` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`) USING BTREE,
KEY `idx` (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `refINT` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dado` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id` (`dado`),
CONSTRAINT `id` FOREIGN KEY (`dado`) REFERENCES `dados` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `refSTR` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`dado` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `nome` (`dado`),
CONSTRAINT `nome` FOREIGN KEY (`dado`) REFERENCES `dados` (`name`) ON DELETE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
每个表插入100条记录,比较最终表大小:
dados: 192.0 KB
refINT: 32.0 KB
refSTR: 32.0 KB
所以我猜数据不会在 varchar 外键中复制,至少在 MySQL 5.1 版本中是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)