#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;
Посмотрите демонстрацию.