MYSQL — столбец переменных с внешним ключом

#mysql

#mysql

Вопрос:

Я хотел бы добавить локализацию в свою базу данных. Я создал languages таблицу и хотел бы добавить внешний ключ в таблицу пользователя:

 CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(30) NOT NULL,
  `email` varchar(100) NOT NULL,
  `password` varchar(60) DEFAULT NULL,
  `registrationDate` datetime DEFAULT current_timestamp(),
  `lastLoginDate` datetime DEFAULT NULL,
  `isConfirmed` tinyint(1) NOT NULL DEFAULT 0,
  `activationKey` varchar(32) NOT NULL,
  `resendEmail` tinyint(1) DEFAULT NULL,
  `subscribedNews` tinyint(1) NOT NULL DEFAULT 1,
  `activated` tinyint(1) DEFAULT 1,
  `lang` varchar(5) NOT NULL DEFAULT 'en'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `email` (`email`);

ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

create table languages(
    code varchar(5) primary key,
    name varchar(255) not null,
    dateFormat varchar(255),
    dateTimeFormat varchar(255),
    currency varchar(255)
);

ALTER TABLE users
ADD lang varchar(5) NOT NULL DEFAULT 'cs';

ALTER TABLE users ADD CONSTRAINT fk_user_lang FOREIGN KEY (lang) REFERENCES languages(code);
  

Я не могу добавить внешний ключ в lang столбец:

код ошибки: 150 «Неправильно сформировано ограничение внешнего ключа»

Почему я не могу создать внешний ключ varchar. Я бы не стал добавлять первичный ключ int в таблицу языков, потому что я хотел бы получать данные из базы данных как /api/users/cs вместо /api/users?lang=1 .

Спасибо

Комментарии:

1. оба типа данных для столбцов FK должны быть одинаковыми

2. Ваш код работает в этой скрипке db: dbfiddle.uk /. … Вероятно, вы не используете точно такой же код в своей базе данных.

3. что select version() дает?

4. @ysth 10.4.11-MariaDB. Может ли это зависеть от настроек сервера mysql?

5. @bluray просто хватается за соломинку, поскольку никто другой, похоже, не может получить вашу ошибку. dbfiddle.uk /… пожалуйста, покажите вывод show create table users перед выполнением alter tables?

Ответ №1:

Вы не указали набор символов или параметры сортировки для languages таблицы.

В то users время как явно utf8 , вы можете использовать версию MySQL, где кодировкой по умолчанию является utf8mb4, или очень старую версию, где кодировкой по умолчанию является latin1 .

Перепроверьте с:

 SHOW CREATE TABLE languagesG
  

Это отобразит кодировку и параметры сортировки для этой таблицы. Он должен быть таким же, как кодировка и параметры сортировки для столбца внешнего ключа в users .

Комментарии:

1. Проблема была в разных сопоставлениях

Ответ №2:

Если вы измените набор символов таблицы по умолчанию languages на utf8 , который вы определили для таблицы users , тогда он будет работать:

 ALTER TABLE languages CONVERT TO CHARACTER SET utf8;
  

Посмотрите демонстрацию.