2015-11-05 64 views
0

另一个表的主键我有一个表user_typeuser_type_id是该表的primary key,我有另一个表user_details其中user_type_idforeign key如何更改外键的数据类型时,在MySQL

我想更改user_type_id列的数据类型。

+0

使用InnoDB的我猜? –

+0

从什么类型到什么类型。我建议您按原样复制到两个工作表,以便在安全沙箱中进行播放,以防'alter table'有损。第一遍 – Drew

+0

我想要将varchar转换为整数 –

回答

2

您必须执行几个步骤。

简而言之:删除外键,将字段user_type_id从varchar修改为int,重新创建外键。

在继续操作之前进行备份非常重要。如果user_type_id值包含任何其他数字,那么varchar到int的转换可能会扰乱一致性。

详细:

  1. 首先,你需要从user_details删除外键。为了得到约束名定义外键运行:

SHOW CREATE TABLE user_details;

你会看到类似这样的:

CONSTRAINT 'some_constraint_name' FOREIGN KEY ('user_type_id') REFERENCES 'user_type' ('user_type_id')

运行

ALTER TABLE user_details DROP FOREIGN KEY some_constraint_name; 
  • 现在你可以改变user_type_id从varchar到int两个user_typeuser_details表:
  • ALTER TABLE user_type CHANGE user_type_id user_type_id INT(length);

    ALTER TABLE user_details CHANGE user_type_id user_type_id INT(length);

    替换length与旧varchar字段长度。

  • 最后重新创建外键:
  • ALTER TABLE user_details ADD FOREIGN KEY (user_type_id) REFERENCES user_type(user_type_id);

    +0

    这个看起来不错,但是'length'并不是做你暗示它在'INT'列上做的事情。这就是“显示宽度”,这是绿屏终端时代的传统功能,这是大多数应用程序忽略的提示。整数的大小仅由8,16,24,32和64位值分别由TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT确定。 http://stackoverflow.com/questions/7552223/int11-vs-intanything-else –

    相关问题