1

我有一个复合主键,它加起来相当大(~2000 字节)。我没有性能考虑,我只是想要一个主键来强制唯一性。

MySql 不喜欢长主键。有没有解决的办法?也许只强制唯一性,而不建立索引?

我不想使用 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;
4

5 回答 5

4

@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 键,因为当您始终通过主键访问行时,通常会使用主键。如果它只是一个约束,请改用 UNIQUE。

于 2009-06-08T05:56:49.060 回答
4

您应该阅读一些有关数据库结构设计的书,然后您将不会拥有具有此类主键的表。或者聘请我为您创建(原型)数据库结构的人。这只是友好的建议。

于 2009-06-07T16:51:45.167 回答
3

使用自动增量整数作为主键并添加另一个唯一键。

或者,您可以尝试将binary(16)用作主键作为值。unhex(md5(concat()))

于 2009-06-07T13:27:59.450 回答
2

不了解您的数据库很难说,但它可能需要一些规范化。您总是可以创建一个UNIQUE INDEX不是主键的,如果已经有一个唯一的列,则将其作为主键,如果没有,您可以创建一个代理主键 ( INTEGER AUTO_INCREMENT)。

于 2009-06-07T13:30:23.253 回答
0

同意@pornel 和@CadeRoux 已经发布的内容;您最好将代理主键 (ConfigurationId) 创建为自动递增的整数列,然后创建单独的唯一索引。

于 2009-06-07T13:35:38.157 回答