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;
但是,在第一次尝试之后,鬼魂的问题仍然存在!