【发布时间】:2016-07-05 06:57:05
【问题描述】:
首先:我不是在寻找一种方法来修复可怕的tablespace exists InnoDB 错误发现here,而是我在寻找一种方法来防止它!在过去的几周里,我们的数据库中随机出现了一个表消失,无法重新创建它(因为它给出了一个表空间存在错误)。我们已将其范围缩小到下表:
CREATE TABLE product_localised (
id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT,
product_id INT (10) UNSIGNED NOT NULL,
language_id INT (10) UNSIGNED NOT NULL,
slug VARCHAR (255) COLLATE utf8_unicode_ci NOT NULL,
title TEXT COLLATE utf8_unicode_ci,
description TEXT COLLATE utf8_unicode_ci,
description_short TEXT COLLATE utf8_unicode_ci,
custom_startselect_content TEXT COLLATE utf8_unicode_ci,
created_at TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY product_localised_product_id_language_id_unique (`product_id`, `language_id`),
KEY product_localised_language_id_foreign (`language_id`),
CONSTRAINT product_localised_language_id_foreign FOREIGN KEY (`language_id`) REFERENCES languages (`id`),
CONSTRAINT product_localised_product_id_foreign FOREIGN KEY (`product_id`) REFERENCES products (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 46727 DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
问题:有人可以查看表的结构和键并判断它是否有任何问题?!
我们将我们的数据库托管在 Amazon 的 RDS 上,并尝试了启用了 innodb_file_per_table 的 MySQL 5.5 和 5.6。
我们还在 Ubuntu Server 14.04 LTS(使用 Vagrant)上尝试了 MySQL 5.5,在 Windows 上使用 xampp 尝试了 MySQL 5.6。
回答以下问题:
考虑删除 id 并使用 (product_id, language_id) 作为 PK。当然,您不需要 20 亿种语言,因此请考虑将 language_id 缩小为 SMALLINT UNSIGNED:
- 我们更喜欢单列主键,因为这样可以更轻松地使用我们的 ORM
- 我们没有一百万种语言,但这只是我们在整个项目中使用的自动增量设置,这肯定不会造成任何问题吗?
【问题讨论】:
-
TABLESPACE子句在哪里?你运行的是什么版本的 MySQL? -
考虑删除
id并使用(product_id, language_id)作为PK。当然,您不需要 20 亿种语言,因此请考虑将language_id缩小为SMALLINT UNSIGNED。 -
你在使用
innodb_file_per_table吗?Barracuda? -
绝对正确,我确信它与表结构有关。刚刚用版本和配置更新了我的问题
-
请向我们展示错误的全文以及引发错误的语句。 (如果是
CREATE,那么就这么说吧。)该语句是手动输入的,还是作为重新加载输入的,还是作为IMPORT输入的?