【发布时间】:2015-11-30 21:12:23
【问题描述】:
我定义了以下 2 个表:
记录状态
显示创建表记录状态
CREATE TABLE `record_status` (
`record_status_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` char(6) NOT NULL,
`status_description` varchar(15) NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`record_status_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
用户
显示创建表用户
CREATE TABLE `user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`handle` varchar(45) NOT NULL,
`email` varchar(255) NOT NULL,
`password` char(64) DEFAULT NULL,
`password_salt` binary(1) DEFAULT NULL,
`first_name` varchar(50) NOT NULL,
`last_name` varchar(50) NOT NULL,
`gender` char(1) DEFAULT NULL,
`birthday` date NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user_status` char(6) DEFAULT NULL,
PRIMARY KEY (`user_id`),
KEY `usr_status_idx` (`user_status`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
我尝试使用mysql Workbench添加CHAR类型的外键user_status,如下所示:
ALTER TABLE `mydatabase`.`user`
ADD CONSTRAINT `usr_status`
FOREIGN KEY (`user_status`)
REFERENCES `mydatabase`.`record_status` (`status`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
但我收到以下错误:
错误:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'mydatabase.#sql-420_1b0' (errno: 150)
ALTER TABLE 'mydatabase'.'user'
ADD CONSTRAINT 'usr_status'
FOREIGN KEY ('user_status')
REFERENCES 'mydatabase'.'record_status'('status')
ON DELETE NO ACTION
ON UPDATE NO ACTION
SQL script execution finished: statements: 4 succeeded, 1 failed.
问题
我的目的是让 status 列清楚地显示每个用户的当前状态(ACTIVE、INACTV、DELETD),同时仍然可以灵活地使用 record_status_id 将 record_status 表与用户表连接起来,以便更好地查找具有给定状态的任何行性能。
我在这里找到了类似的帖子 Adding foreign key of type char in mysql 这建议更改我的主键的排序规则,但是,这将如何影响我的用户表?
我是否也必须将排序规则更改为用户表中的 user_status 字段?每次用户登录时都会查询用户表,我担心性能或这可能导致的任何限制。
我还打算将状态的外键添加到其他几个表中。我只想知道这会如何影响性能,还是会增加任何限制?
任何有关我的设计的意见也将不胜感激。感谢您的帮助!
【问题讨论】:
-
如果您为我们发布实际的
CREATE声明[最好是未删节的SHOW CREATE输出],我们可以看看我们是否可以在我们自己的系统上重新创建和解决问题。 -
我已经编辑了我的问题以包含 SHOW CREATE 输出详细信息。谢谢!
标签: mysql database-design mysql-workbench