首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用主键和唯一索引varchar对mysql中的表进行分区?

问如何使用主键和唯一索引varchar对mysql中的表进行分区?
EN

Stack Overflow用户
提问于 2015-07-16 06:50:31
回答 1查看 632关注 0票数 0

我使用mysql 5.6,我有一个带有auto_increment primary key的表,还有一个带有十六进制值的unique列。Unique列用于确保不允许向表中插入重复项。

代码语言:javascript
复制
CREATE TABLE `my_table` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `hexvalue` VARCHAR(32) NOT NULL DEFAULT '',
  `create_date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `hexvalue` (`hexvalue`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我试图分割它时,它说

代码语言:javascript
复制
ALTER TABLE `my_table` PARTITION BY HASH ( id + hexvalue) PARTITIONS 10;
ERROR 1491 (HY000): The PARTITION function returns the wrong type

由于hexvalue是varchar,所以当我试图使用CONV()函数将十六进制值转换为十进制时,它无法返回整数值。

代码语言:javascript
复制
The patition function is not allowed

P.S:-我还查了http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-functions.html

我可以用黑客来划分这张桌子吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-27 23:48:59

首先,我必须质疑您是否需要PARTITION表。其次,我必须指出,我没有听说过HASH分区的有用案例。

如果您有一个UNIQUE列,它可能应该是PRIMARY KEY而不是人工的AUTO_INCREMENT。好吧,你会(有效地)争辩它是“长”的。如果它是真正的十六进制,那么将其打包为二进制并使用BINARY(16)。现在它只有16个字节,而不是32个;这更接近于一个INT的4个字节。见HEX()和UNHEX()。

由于您似乎没有其他的辅助键,大小的PK并不重要的目的。也许您从其他表引用了id,它们将不得不更改为BINARY(16)。

除了这三列之外,这个表中没有别的东西了吗?看上去很奇怪。我之所以这样问,是因为通常正确的模式建议需要更多地了解表、其列、SELECTs等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31447155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档