如何在mysql中的另一个表中的主键时更改外键的数据类型

时间:2015-11-05 05:57:55

标签: mysql

我有一个表user_typeuser_type_id是该表的primary key,我有另一个表user_details,其中user_type_idforeign key

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

3 个答案:

答案 0 :(得分:5)

您必须执行几个步骤。

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

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

详细说明:

  1. 首先,您需要从SHOW CREATE TABLE user_details;删除外键。要获取定义外键的约束名称,请执行:
  2. 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
    1. 现在,您可以在user_typeuser_details表格中将ALTER TABLE user_type CHANGE user_type_id user_type_id INT(length);从varchar更改为int:
    2. ALTER TABLE user_details CHANGE user_type_id user_type_id INT(length);

      length

      ALTER TABLE user_details ADD FOREIGN KEY (user_type_id) REFERENCES user_type(user_type_id);替换为旧的varchar字段长度。

      1. 最后重新创建外键:
      2. WITH defaultvalues AS ( SELECT DISTINCT n.Name, [type], [date], [Value] AS cap FROM mytable LEFT JOIN nametable AS n ON mytable.x = r.Id AND [Date] IS NULL ), changedvalue AS ( SELECT DISTINCT n.Name, [type], [date], CASE WHEN d.Date = GETDATE() AND Parameter = '1' THEN [Value] WHEN Parameter = '2' THEN '0' END AS CAP FROM mytable LEFT JOIN nametable AS n ON mytable.x = r.Id WHERE Parameter IN ( '1', '2' ) ) SELECT * FROM [changedvalue] UNION SELECT * FROM [defaultvalues] WHERE NOT EXISTS ( SELECT * FROM [changedvalue] );

答案 1 :(得分:1)

我有一个类似的情况,mobo列的数据类型为CHAR(10),并希望将其转换为VARCHAR(16)数据类型。

我在下面的查询中使用了迁移数据库的方法。

SET foreign_key_checks = 0;
ALTER TABLE `user`
CHANGE `mobno` `mobno` varchar(16) COLLATE 'utf8_general_ci' NOT NULL FIRST;
ALTER TABLE `staff`
CHANGE `mobno` `mobno` varchar(16) COLLATE 'utf8_general_ci' NOT NULL AFTER `officeid`;
SET foreign_key_checks = 1;    

重要说明是在运行查询之前使用SET foreign_key_checks = 0;,然后通过运行SET foreign_key_checks = 1;

将其重新设置为1。

答案 2 :(得分:0)

SET foreign_key_checks = 0; 
ALTER TABLE `user` 
    CHANGE `mobno` `mobno` varchar(16) COLLATE 'utf8_general_ci' NOT NULL FIRST; 
ALTER TABLE `staff` 
    CHANGE `mobno` `mobno` varchar(16) COLLATE 'utf8_general_ci' NOT NULL AFTER `officeid`; 
SET foreign_key_checks = 1;