如何在 "json_array" 类型的列上使用 Doctrine 在 Symfony 3 中添加复合索引?
How do I add compound index in Symfony 3 using Doctrine on column of type "json_array"?
我有一个 table,我想添加这样的索引:
@Index(columns={"child_id", "abilities"}),
@Index(columns={"parent_id", "abilities"}),
...
* @ORM\Column(type="json_array", length=256)
*/
protected $abilities;
但是,即使在迁移中添加了适当的限制之后:
$this->addSql('CREATE INDEX IDX_1088BF61DD62C21BB8388DA4 ON xxx (child_id, abilities(512))');
$this->addSql('CREATE INDEX IDX_1088BF61727ACA70B8388DA4 ON xxx (parent_id, abilities(512))');
当 运行 测试重新创建数据库时会出现这样的错误:
An exception occurred while executing '
CREATE TABLE xxx (
id INT AUTO_INCREMENT NOT NULL,
parent_id INT DEFAULT NULL,
child_id INT DEFAULT NULL,
type VARCHAR(125) NOT NULL,
abilities LONGTEXT NOT NULL COMMENT '(DC2Type:json_array)',
created_at DATETIME NOT NULL,
modified_at DATETIME NOT NULL,
INDEX IDX_1088BF61727ACA70 (parent_id),
INDEX IDX_1088BF61DD62C21B (child_id),
INDEX IDX_1088BF61DD62C21B8CDE5729 (child_id, type),
INDEX IDX_1088BF61727ACA708CDE5729 (parent_id, type),
INDEX IDX_1088BF618CDE5729 (type),
INDEX IDX_1088BF61DD62C21BB8388DA4 (child_id, abilities),
INDEX IDX_1088BF61727ACA7 0B8388DA4 (parent_id, abilities),
INDEX IDX_1088BF61B8388DA4 (abilities),
UNIQUE INDEX UNIQ_1088BF61727ACA70DD62C21B (parent_id, child_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB
':
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT
column 'abilities' used in key specification without a key length
我需要做什么才能在这些列上成功创建索引?
索引长字符串有限制。
由于所讨论的字符串包含 "json",因此对该列进行常规索引是没有用的。
解决方案:去掉这 3 个索引:
INDEX IDX_1088BF61DD62C21BB8388DA4 (child_id, abilities),
INDEX IDX_1088BF61727ACA7 0B8388DA4 (parent_id, abilities),
INDEX IDX_1088BF61B8388DA4 (abilities),
我有一个 table,我想添加这样的索引:
@Index(columns={"child_id", "abilities"}),
@Index(columns={"parent_id", "abilities"}),
...
* @ORM\Column(type="json_array", length=256)
*/
protected $abilities;
但是,即使在迁移中添加了适当的限制之后:
$this->addSql('CREATE INDEX IDX_1088BF61DD62C21BB8388DA4 ON xxx (child_id, abilities(512))');
$this->addSql('CREATE INDEX IDX_1088BF61727ACA70B8388DA4 ON xxx (parent_id, abilities(512))');
当 运行 测试重新创建数据库时会出现这样的错误:
An exception occurred while executing '
CREATE TABLE xxx (
id INT AUTO_INCREMENT NOT NULL,
parent_id INT DEFAULT NULL,
child_id INT DEFAULT NULL,
type VARCHAR(125) NOT NULL,
abilities LONGTEXT NOT NULL COMMENT '(DC2Type:json_array)',
created_at DATETIME NOT NULL,
modified_at DATETIME NOT NULL,
INDEX IDX_1088BF61727ACA70 (parent_id),
INDEX IDX_1088BF61DD62C21B (child_id),
INDEX IDX_1088BF61DD62C21B8CDE5729 (child_id, type),
INDEX IDX_1088BF61727ACA708CDE5729 (parent_id, type),
INDEX IDX_1088BF618CDE5729 (type),
INDEX IDX_1088BF61DD62C21BB8388DA4 (child_id, abilities),
INDEX IDX_1088BF61727ACA7 0B8388DA4 (parent_id, abilities),
INDEX IDX_1088BF61B8388DA4 (abilities),
UNIQUE INDEX UNIQ_1088BF61727ACA70DD62C21B (parent_id, child_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB
':
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'abilities' used in key specification without a key length
我需要做什么才能在这些列上成功创建索引?
索引长字符串有限制。
由于所讨论的字符串包含 "json",因此对该列进行常规索引是没有用的。
解决方案:去掉这 3 个索引:
INDEX IDX_1088BF61DD62C21BB8388DA4 (child_id, abilities),
INDEX IDX_1088BF61727ACA7 0B8388DA4 (parent_id, abilities),
INDEX IDX_1088BF61B8388DA4 (abilities),