Mysql Percona在尝试在有生成的字段的字段上创建唯一索引时压缩表

时间:2016-09-23 10:56:11

标签: mysql percona

CREATE TABLE tasks (
`user_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
`code` VARCHAR(255) NOT NULL,
`params` JSON,
`hash` VARCHAR(32) GENERATED ALWAYS AS (MD5(`params`)),
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
CONSTRAINT `tasks_user_id_users_id_fk` 
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

然后我尝试在user_id和hash上添加一个唯一索引,我试图在表创建期间执行它,但是外键有问题,所以我决定单独执行。

ALTER TABLE tasks   
ADD  UNIQUE INDEX `tasks_user_id_hash_unique_idx` (`user_id`, `hash`);

然后我得到奇怪的问题错误1146

Table '<dbname>.tasks' doesn't exist
从那时起奇怪的错误 1.我不能删除它,它存在,我不能用它做任何事情,因为它不存在。在mysql重新加载后,我删除了表,但如果我尝试再次创建它:     错误代码:1813     表空间“<dbname>tasks”存在。

我找到了对于唯一字段的决定,我简单地创建了md5(hash + user_id)UNIQUE。但是,我怎样才能摆脱仍然存在的问题和正在发生的事情。它看起来像是mysql Percona 5.7.14-7中的BUG

所以创建表的正确方法

CREATE TABLE tasks (
`user_id` INT(10) UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
`code` VARCHAR(255) NOT NULL,
`params` JSON,
`hash` VARCHAR(32) GENERATED ALWAYS AS (MD5(CONCAT(`params`,`user_id`))) UNIQUE,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
CONSTRAINT `tasks_user_id_users_id_fk` 
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
 )ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

但是,在第一次尝试之后,鬼魂的问题仍然存在!

0 个答案:

没有答案