我有一个表user_type
而user_type_id
是该表的primary key
,我有另一个表user_details
,其中user_type_id
是foreign key
我想更改user_type_id
列的数据类型。
答案 0 :(得分:5)
您必须执行几个步骤。
简而言之:删除外键,将字段user_type_id从varchar修改为int,重新创建外键。
在继续之前进行备份是非常重要的。如果user_details
值包含其他任何数字,那么varchar到int转换可能会破坏一致性。
详细说明:
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
user_type
和user_details
表格中将ALTER TABLE user_type CHANGE user_type_id user_type_id INT(length);
从varchar更改为int: 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字段长度。
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;
答案 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;