尝试添加外键关系时,mysql中的外键约束

时间:2017-07-01 08:17:00

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

我有两个名为activity和user的表。我需要与这两个表建立外键关系。 username是我的用户表的主键,它是一个varchar值。但是当我试图建立关系时,我得到一个外键约束错误,错误代码为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;

2 个答案:

答案 0 :(得分:3)

只需添加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;

答案 1 :(得分:2)

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

  

13.1.18.6 Using FOREIGN KEY Constraints

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

所以activity需要

ENGINE=InnoDB DEFAULT CHARSET=latin1;

你也会找到

  

除了SHOW ERRORS之外,如果涉及InnoDB表的外键错误(通常是MySQL服务器中的错误150),您可以通过检查最新的InnoDB外键错误获得详细说明。输出SHOW ENGINE INNODB STATUS