【问题标题】:MYSQL - foreign key varchar columnMYSQL - 外键 varchar 列
【发布时间】:2020-09-21 18:27:28
【问题描述】:

我想将本地化添加到我的数据库中。我创建了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 从数据库中获取数据。

谢谢

【问题讨论】:

  • FK 列的两种数据类型必须相同
  • 你的代码在这个 db fiddle 中工作:dbfiddle.uk/…。很可能,您没有在数据库中运行完全相同的代码。
  • select version() 给了什么?
  • @ysth 10.4.11-MariaDB。能否依赖mysql服务器设置?
  • @bluray 只是抓住了稻草,因为似乎没有其他人能够理解您的错误。 dbfiddle.uk/… 请在更改表之前显示show create table users 的输出?

标签: mysql


【解决方案1】:

您没有为languages 表指定字符集或排序规则。

users 显式为 utf8,您可能正在使用默认字符集为 utf8mb4 的 MySQL 版本或默认字符集为 latin1 的非常旧的版本。

仔细检查:

SHOW CREATE TABLE languages\G

这将显示该表的字符集和排序规则。它必须与users 中外键列的字符集和排序规则相同。

【讨论】:

  • 问题出现在不同的排序规则中
【解决方案2】:

如果您将表 languages 的默认字符集更改为 utf8,这是您为表 users 定义的,那么它将起作用:

ALTER TABLE languages CONVERT TO CHARACTER SET utf8;

请参阅demo

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多