首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql主键> 900/1000字节?

MySql主键> 900/1000字节?
EN

Stack Overflow用户
提问于 2009-06-07 13:20:15
回答 5查看 715关注 0票数 1

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

MySql doesn't like long primary keys。有什么办法可以解决这个问题吗?也许只是为了增强唯一性,而不是构建索引?

我不想仅仅为了启用主键而使用ASCII码而不是UTF8 (UTF8字符需要3个字节)。

我的表定义如下:

代码语言:javascript
复制
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;
EN

回答 5

Stack Overflow用户

发布于 2009-06-07 16:51:45

你应该读一些关于数据库结构设计的书,然后你就不会有这样的主键的表了。或聘请某人谁我创建(原型)为你的DB结构。这只是一个友好的建议。

票数 4
EN

Stack Overflow用户

发布于 2009-06-08 05:56:49

对于这种情况,@porneL有正确的答案,但是@Cade Roux@noonex也是正确的:数据库不应该像Excel那样使用。

您应该有辅助表:

代码语言:javascript
复制
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)
);

对于每个表,数据除外,每个配置行都是唯一的。

插入时,请执行以下操作:

代码语言:javascript
复制
INSERT INTO ServiceInstance (Hash, ServiceInstanceID) VALUES (unhex(md5('whatever')), 'whatever');

然后,您的主表变为:

代码语言:javascript
复制
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。

票数 4
EN

Stack Overflow用户

发布于 2009-06-07 13:27:59

主键使用自动递增的整数,并添加另一个唯一键。

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

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

https://stackoverflow.com/questions/961876

复制
相关文章

相似问题

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