我有一个复合主键,它加起来相当大(大约2000字节)。我没有性能方面的考虑,我只想要一个主键来增强唯一性。
MySql doesn't like long primary keys。有什么办法可以解决这个问题吗?也许只是为了增强唯一性,而不是构建索引?
我不想仅仅为了启用主键而使用ASCII码而不是UTF8 (UTF8字符需要3个字节)。
我的表定义如下:
CREATE TABLE `configuration` (
`Section` varchar(200) NOT NULL,
`StoredKey` VARCHAR(200) NOT NULL,
`ServiceName` VARCHAR(300) NOT NULL,
`ServiceMajorVersion` int unsigned NOT NULL,
`ServiceMinorVersion` int unsigned NOT NULL,
`ServiceInstanceID` VARCHAR(100) NOT NULL,
`StoredValue` VARCHAR(1024)
, PRIMARY KEY (`Section`, `StoredKey`, `ServiceName`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;发布于 2009-06-07 16:51:45
你应该读一些关于数据库结构设计的书,然后你就不会有这样的主键的表了。或聘请某人谁我创建(原型)为你的DB结构。这只是一个友好的建议。
发布于 2009-06-08 05:56:49
对于这种情况,@porneL有正确的答案,但是@Cade Roux和@noonex也是正确的:数据库不应该像Excel那样使用。
您应该有辅助表:
CREATE TABLE ServiceInstance (
ID int(11) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
Hash binary(16) NOT NULL,
ServiceInstanceID varchar(100) NOT NULL,
UNIQUE(Hash)
);对于每个表,数据除外,每个配置行都是唯一的。
插入时,请执行以下操作:
INSERT INTO ServiceInstance (Hash, ServiceInstanceID) VALUES (unhex(md5('whatever')), 'whatever');然后,您的主表变为:
CREATE TABLE `configuration` (
`Section_ID` int unsigned NOT NULL,
`StoredKey_ID` int unsigned NOT NULL,
`ServiceName_ID` int unsigned NOT NULL,
`ServiceMajorVersion` int unsigned NOT NULL,
`ServiceMinorVersion` int unsigned NOT NULL,
`ServiceInstanceID` int unsigned NOT NULL,
`StoredValue` VARCHAR(1024),
UNIQUE (`Section_ID`, `StoredKey_ID`, `ServiceName_ID`, `ServiceMajorVersion`, `ServiceMinorVersion`, `ServiceInstanceID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;请改用唯一键,因为当您将始终通过主键访问行时,通常使用主键。如果它只是一个约束,请改用UNIQUE。
发布于 2009-06-07 13:27:59
主键使用自动递增的整数,并添加另一个唯一键。
或者,您可以尝试使用binary(16)作为主键,并将unhex(md5(concat(列)))作为值。
https://stackoverflow.com/questions/961876
复制相似问题