我有两个名为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;
答案 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
。