SQL创建表错误 - 密钥太长了?

时间:2015-11-18 08:17:45

标签: mysql sql

我使用以下SQL命令创建一个表,但它给了我以下错误。

#1071 - Specified key was too long; max key length is 1000 bytes

我检查了SQL文档,它说“消息:指定的密钥太长;最大密钥长度是%d字节”,这没有太大帮助。

CREATE TABLE Consist_of
(
    dssn    INTEGER,
    pre_no  VARCHAR(255),
    pname   VARCHAR(255),
    trade_name VARCHAR(255),
    FOREIGN KEY (dssn, pre_no) REFERENCES Prescription(dssn, pre_no),
    FOREIGN KEY (pname, trade_name) REFERENCES Drug(pname, trade_name)
);

3 个答案:

答案 0 :(得分:0)

因此,根据错误,很明显您已超过最大限制。对于MyISAM表,它是1000字节,对于InnoDB,它设置为767字节。

您可以参考resolution of this bug reported

答案 1 :(得分:0)

此错误表示索引索引的长度超过1000个字节。 MySQL和存储引擎可能有此限制。 MySQL 5.5上有类似的错误 - '指定密钥太长;运行此脚本时,最大密钥长度为3072字节:

CREATE TABLE IF NOT EXISTS example_table1 (
  first_col varchar(500) NOT NULL,
  second_col varchar(500) NOT NULL,
  third_col varchar(500) NOT NULL,
  KEY `index` (first_col, second_col, third_col)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UTF8是多字节的,密钥长度以这种方式计算--500 * 3 * 3 = 4500字节。

但请注意,下一个查询有效!

CREATE TABLE IF NOT EXISTS example_table1 (
  first_col varchar(500) NOT NULL,
  second_col varchar(500) NOT NULL,
  third_col varchar(500) NOT NULL,
  KEY `index` (first_col, second_col, third_col)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

答案 2 :(得分:0)

使用(我假设)utf8的字符集,VARCHAR(255)的索引需要255 x 3 = 765个字节。 在您的情况下(255+255+255) x 3 = 2295(对于每个varchar行)。

您可以通过将innodb_large_prefix设置为YES以及您需要的其他设置来将MySQL 5.6中的最大InnoDB索引前缀大小增加到3072字节,以便启用该设置,如下所述: http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix