MySql - Код ошибки: 1932. Таблица не существует в движке - PullRequest
0 голосов
/ 23 января 2020

Я получаю сообщение об ошибке ниже при перезапуске mysql после добавления поля enum в мою существующую таблицу. Блокирует таблицу и устраняет только полное восстановление базы данных, так как я не могу удалить таблицу.

Error Code: 1932. Table 'users' doesn't exist in engine

Моя таблица и данные выглядят следующим образом:

CREATE TABLE `users` (
  `id` char(36) NOT NULL,
  `name` varchar(191) NOT NULL,
  `email` varchar(191) NOT NULL,
  `password` varchar(191) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`)
);

INSERT INTO `users` VALUES 
(
    '11111111-1111-1111-1111-111111111111',
    'John Doe',
    'user@email.com',
    'password',
    NOW(),
    NOW()
);

Таблица выше работает до выполняется строка ниже и mysql перезапускается.

ALTER TABLE users ADD `role` enum('test1', 'test2') AFTER `password`

Я также сделал diff для структуры таблицы до и после. Только строка с комментарием добавляется и блокирует таблицу.

CREATE TABLE `users2` (
  `id` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `role` enum('test1','test2') COLLATE utf8mb4_unicode_ci DEFAULT NULL, -- only diff
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users1_email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Вот где это странно. Строка ниже добавляет роль к концу таблицы и не блокирует таблицу.

ALTER TABLE users ADD `role` enum('test1', 'test2'); -- AFTER `password`

Кажется, что ПОСЛЕ проблемы. Не имеет значения, если я попробую другую позицию.

Любые предложения будут оценены.

1 Ответ

1 голос
/ 23 января 2020

Вы также можете назначить значение по умолчанию при добавлении столбца.

ALTER TABLE users ADD `role` enum('test1', 'test2') DEFAULT 'test1' AFTER `password`;

Таким образом, значения NULL не будут разрешены, и всем строкам будет присвоен 'test1' .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...