我使用mysql 5.6
我有一个包含auto_increment primary key
和unique
列的表,其中包含十六进制值。
唯一列用于确保不允许将重复项插入表中。
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;
当我尝试分区时说
ALTER TABLE `my_table` PARTITION BY HASH ( id + hexvalue) PARTITIONS 10;
ERROR 1491 (HY000): The PARTITION function returns the wrong type
由于hexvalue
是varchar
,当我尝试使用CONV()
函数将十六进制值转换为十进制时,它无法返回一个整数值
The patition function is not allowed
P.s: - 我还检查了http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-functions.html
我可以破解这个表吗?
答案 0 :(得分:0)
首先,我必须质疑你对PARTITION
表的需要。其次,我必须指出,我听说HASH
分区没有用处。
如果您有UNIQUE
列,则可能应该使用PRIMARY KEY
代替人工AUTO_INCREMENT
。好吧,你会(有效地)认为它是“长”的。如果它是真正的十六进制,则将其打包成二进制并使用BINARY(16)
。现在它只有16个字节,而不是32个字节;这更接近INT
的4个字节。请参阅HEX()
和UNHEX()
。
由于您似乎没有其他辅助密钥,因此PK的大小与此无关。也许您从其他表中引用id
,他们必须更改为BINARY(16)
?
除了3列之外,此表中没有其他内容吗?似乎很奇怪。我问,因为经常正确的架构建议需要更多地了解表,它的列,SELECTs
等。