Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql使用外键将int列更改为bigint_Mysql_Foreign Keys_Int_Alter_Bigint - Fatal编程技术网

mysql使用外键将int列更改为bigint

mysql使用外键将int列更改为bigint,mysql,foreign-keys,int,alter,bigint,Mysql,Foreign Keys,Int,Alter,Bigint,我想将数据库中某些主键列的数据类型从INT更改为BIGINT。以下定义是说明问题的玩具示例: CREATE TABLE IF NOT EXISTS`owner`( `id`int(11)非空自动增量, `thing_id`int(11)不为空, 主键(`id`), 键'thing\u id'('thing\u id`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8\U unicode\U ci AUTO\U INCREMENT=1; 如果存在“

我想将数据库中某些主键列的数据类型从INT更改为BIGINT。以下定义是说明问题的玩具示例:

CREATE TABLE IF NOT EXISTS`owner`(
`id`int(11)非空自动增量,
`thing_id`int(11)不为空,
主键(`id`),
键'thing\u id'('thing\u id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8\U unicode\U ci AUTO\U INCREMENT=1;
如果存在“thing”,则删除表;
如果不存在“thing”,则创建表(
`id`int(11)非空自动增量,
主键(`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8\U unicode\U ci AUTO\U INCREMENT=1;
改变表格所有者`
添加约束`owner\u ibfk\u 1`外键(`thing\u id`)引用`thing`(`id`);
现在,当我尝试执行以下命令之一时:

ALTER TABLE`thing`CHANGE`id`id`BIGINT NOT NULL自动递增;
ALTER表`owner`CHANGE`thing\u id``thing\u id`BIGINT不为空;
我遇到了一个错误

#1025 - Error on rename of './debug/#[temp-name]' to './debug/[tablename]' (errno: 150)
显示INODB状态输出:

LATEST FOREIGN KEY ERROR
------------------------
120126 13:34:03 Error in foreign key constraint of table debug/owner:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
 CONSTRAINT "owner_ibfk_1" FOREIGN KEY ("thing_id") REFERENCES "thing" ("id")

我猜外键定义会阻止更改两侧的列类型。解决这个问题的简单方法是删除外键定义、更改列并重新定义外键。有更好的解决方案吗?

我建议您在GUI工具(免费试用版)中重命名此类字段:


只需在数据库资源管理器中选择要重命名的字段,单击重构->重命名命令,在打开的窗口中输入新名称,然后按“确定”,它将重命名该字段并自动重新创建所有外键。

即使使用
设置外键检查=0
,也不能更改约束列的类型。 从MySQL文档:

但是,即使foreign\u key\u checks=0,InnoDB也不允许在列引用非匹配列类型时创建外键约束。


因此,我同意德瓦特的评论。只需删除它并重新创建它。

我遇到了类似的问题,解决方案是更改条款:

ALTER TABLE table_name CHANGE id id BIGINT(20) NOT NULL AUTO_INCREMENT;

这对我很有用。

即使您更改了
id
thing\u id
的列大小,行中的原始数据仍然是4字节整数,而不是8字节整数。但是你可以转换数据

试试这个解决方案。最近,我不得不在一个大型数据集上做类似的事情,当数据集可能变得太大时,将INT列转换为BIGINT

ALTER TABLE `owner`
DROP FOREIGN KEY `owner_ibfk_1`;

ALTER TABLE `thing` CHANGE `id` `id` BIGINT NOT NULL AUTO_INCREMENT;
ALTER TABLE `owner` CHANGE `thing_id` `thing_id` BIGINT NOT NULL;

UPDATE `thing` SET `id` = CAST(`id` AS UNSIGNED INTEGER);
UPDATE `owner` SET `thing_id` = CAST(`thing_id` AS UNSIGNED INTEGER);

-- Now the data are BIGINTs; re-create the foreign key constraint

ALTER TABLE `owner`
  ADD CONSTRAINT `owner_ibfk_1` FOREIGN KEY (`thing_id`) REFERENCES `thing` (`id`);

你提到的方法并不幼稚,你真的可以使用它。谢谢Devart!我一直在寻找一个不那么痛苦的解决方案,因为我必须在很多表上使用它,但显然,删除并重新创建约束似乎是一条出路:-/。这个问题是在2012年提出的,从MySQL InnoDB的角度来看,2019年有任何更新或发现。这样可以简化我们进行更新的方式。特别是当涉及1000多个表的大量表时。尝试禁用外键检查也不起作用。谢谢你指出原因。