【问题标题】:Foreign key constrains in mysql when trying to add foreign key relationship尝试添加外键关系时mysql中的外键约束
【发布时间】:2017-12-05 03:26:25
【问题描述】:

我有两个表,分别称为活动和用户。我需要与这两个表建立外键关系。用户名是我的用户表的主键,它是一个 varchar 值。但是当我试图建立关系时,我得到一个外键约束错误,mysql 错误代码为 1215。下面是我提到的与两个表相关的 DDL 语句。

谁能帮我解决这个问题。

谢谢

CREATE TABLE `user` (
  `username` varchar(50) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `password` varchar(500) DEFAULT NULL,
  `activated` tinyint(1) DEFAULT '0',
  `activationkey` varchar(50) DEFAULT NULL,
  `resetpasswordkey` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`username`),
  UNIQUE KEY `user_id_UNIQUE` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE activity (
  activity_id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  activity_type_id     INT UNSIGNED,
  activity_property_id  INT UNSIGNED,
  added_by             varchar(50),
  updated_by           varchar(50),
  activity_code        VARCHAR(50),
  activity_description VARCHAR(100),
  start_date           TIMESTAMP NULL,
  end_date             TIMESTAMP NULL,
  start_time           VARCHAR(10),
  end_time             VARCHAR(10),
  added_date           TIMESTAMP NULL,
  updated_date         TIMESTAMP NULL,
  is_available         TINYINT(1),
  PRIMARY KEY (activity_id),

  CONSTRAINT fk_ADDED_BY_FOR_ACTIVITY FOREIGN KEY (added_by) REFERENCES user (username),
  CONSTRAINT fk_UPDATED_BY_FOR_ACTIVITY FOREIGN KEY (updated_by) REFERENCES user (username)
)
  ENGINE = InnoDB;

【问题讨论】:

标签: mysql sql foreign-keys foreign-key-relationship


【解决方案1】:

您的错误是 FK 列类型与 PK 列类型不匹配。特别是,字符集不同。阅读有关外键的文档部分。

13.1.18.6 Using FOREIGN KEY Constraints

  • 外键和引用键中的对应列必须具有相似的数据类型。 整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

所以activity需要

ENGINE=InnoDB DEFAULT CHARSET=latin1;

你还会发现

除了SHOW ERRORS外,如果发生涉及InnoDB表的外键错误(通常是MySQL Server中的Error 150),您可以通过查看InnoDB的输出获得最近一次InnoDB外键错误的详细解释SHOW ENGINE INNODB STATUS

【讨论】:

    【解决方案2】:

    只需添加 DEFAULT CHARSET=latin1。试试下面的查询。

        CREATE TABLE activity (
      activity_id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
      activity_type_id     INT UNSIGNED,
      activity_property_id  INT UNSIGNED,
      added_by             VARCHAR(50) DEFAULT NULL,
      updated_by           VARCHAR(50) DEFAULT NULL,
      activity_code        VARCHAR(50),
      activity_description VARCHAR(100),
      start_date           TIMESTAMP NULL,
      end_date             TIMESTAMP NULL,
      start_time           VARCHAR(10),
      end_time             VARCHAR(10),
      added_date           TIMESTAMP NULL,
      updated_date         TIMESTAMP NULL,
      is_available         TINYINT(1),
      PRIMARY KEY (activity_id),
      CONSTRAINT fk_ADDED_BY_FOR_ACTIVITY FOREIGN KEY (added_by) REFERENCES user (username),
      CONSTRAINT fk_UPDATED_BY_FOR_ACTIVITY FOREIGN KEY (updated_by) REFERENCES user (username)
    )
      ENGINE = InnoDB DEFAULT CHARSET=latin1;
    

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2021-11-05
      相关资源
      最近更新 更多