Проблема с MariaDB. Попытка создать таблицу с ограничением, которая имеет вход с множественным выбором

у меня есть следующий код, который я пытаюсь выполнить

CREATE TABLE ShoppingCentreShop (
CentreCode varchar(255),
ShopNo int,
Category  varchar(255),
CustomerRating int,
**CONSTRAINT CHK_Category CHECK ( Category in ('FASHION', 'ENTERTAINMENT','FOOD')),**
CONSTRAINT CHK_CustomerRating CHECK ( CustomerRating between 1 and 5),
CONSTRAINT fk_ShoppingCentre_CentreCode FOREIGN KEY (CentreCode)  REFERENCES ShoppingCentre(CentreCode),
CONSTRAINT fk_Shop_ShopNo FOREIGN KEY (ShopNo)  REFERENCES Shop(ShopNo)
);

и я получаю следующие коды ошибок

  1. «Название символа ожидалось! Зарезервированное ключевое слово нельзя использовать в качестве имени столбца без обратных кавычек. (рядом с "ЧЕК" на позиции 147)
  2. Неожиданное начало выступления. (рядом с "Категорией" на позиции 155)
  3. Неизвестный тип оператора. (около "in" на позиции 164)

ошибка появляется в жирной строке кода «Я новичок в MySQL, поэтому любая помощь будет принята с благодарностью».

РЕДАКТИРОВАТЬ: я также получаю следующую строку ошибки «# 1005 - Не удается создать таблицу shopping_centres.shoppingcentreshop (ошибка: 150 «Ограничение внешнего ключа сформировано неправильно») (Подробности…)»


person jacksfrustration    schedule 29.03.2020    source источник
comment
Когда вы удаляете выделенную строку, вы по-прежнему получаете ошибки, и если да, то какие?   -  person Tim Biegeleisen    schedule 29.03.2020
comment
Вы уверены, что эти сообщения об ошибках исходят от mariadb?   -  person Shadow    schedule 29.03.2020
comment
Я не могу воспроизвести вашу проблему db-fiddle.com/f/hMVPPCNqWbLCfUnATUgQoB/0   -  person P.Salmon    schedule 29.03.2020
comment
@TimBiegeleisen, когда я удаляю проблемную строку, я получаю код ошибки в следующей строке, что также является ограничением множественного выбора   -  person jacksfrustration    schedule 29.03.2020
comment
@shadow я не могу ответить на этот вопрос, потому что я не знаю, как ..   -  person jacksfrustration    schedule 29.03.2020
comment
@P.Salmon дело в том, что я настроил его с помощью этого кода несколько дней назад, и проблем не было, но я попытался воспроизвести его сегодня и получил вышеупомянутые коды ошибок.   -  person jacksfrustration    schedule 29.03.2020
comment
Все, что я могу предложить, это то, что в коде есть непечатаемые символы. Попробуйте скопировать и вставить из скрипки   -  person P.Salmon    schedule 29.03.2020
comment
какую версию MySQL или MariaDB вы используете?   -  person Hartmut Holzgraefe    schedule 29.03.2020
comment
Я пробовал MariaDB с 10.1 по 10.4, а также MySQL 5.7 и 8.0, но ни на одном из них я не получаю никаких ошибок...   -  person Hartmut Holzgraefe    schedule 29.03.2020
comment
@HartmutHolzgraefe, я использую mariadb версии 10.4.11.   -  person jacksfrustration    schedule 30.03.2020
comment
Даже при явном тестировании с 10.4.11 я не могу воспроизвести это (я удалил ограничения FK, но два ограничения CHECK анализируются без ошибок)   -  person Hartmut Holzgraefe    schedule 31.03.2020


Ответы (1)


Почему бы вам не использовать ENUM()?

CREATE TABLE ShoppingCentreShop
(
  CentreCode varchar(255),
  ShopNo int,
  Category ENUM('FASHION','ENTERTAINMENT','FOOD'),
  CustomerRating int,
  CONSTRAINT CHK_CustomerRating CHECK (CustomerRating BETWEEN 1 AND 5),
  CONSTRAINT fk_ShoppingCentre_CentreCode FOREIGN KEY (CentreCode) REFERENCES ShoppingCentre(CentreCode),
  CONSTRAINT fk_Shop_ShopNo FOREIGN KEY (ShopNo) REFERENCES Shop(ShopNo)
)
person sbrbot    schedule 29.03.2020
comment
я попробовал перечисление и получил следующий код ошибки # 1064 - у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с «CustomerRating между 1 и 5), CONSTRAINT fk_ShoppingCentre_CentreCode FOREIG» в строке 7. - person jacksfrustration; 30.03.2020
comment
В заголовке вы сказали, что работаете с MySQL, а не с MariaDB. Также у вас должен быть MySQL 8.0.16 и выше для полной функциональности CHECK. См.: dev.mysql.com/doc/ refman/8.0/ru/ - person sbrbot; 31.03.2020
comment
Также у вас должен быть MySQL 8.0.16 и выше для полного функционала CHECK... ИЛИ MariaDB ›= 10.2, в котором они уже работали около двух лет назад... просто скажите "в - person Hartmut Holzgraefe; 31.03.2020
comment
@HartmutHolzgraefe у меня есть mariadb версии 10.4.11, как я упоминал выше - person jacksfrustration; 31.03.2020
comment
Вместо ограничения CHECK попробуйте использовать тип ENUM(1,2,3,4,5) для столбца CustomerRating вместо типа int. - person sbrbot; 07.04.2020