我正在尝试按如下方式更改表格。但我收到错误代码:
1834无法从外键约束中删除父表中的行' downloads_ibfk'表下载。
ALTER TABLE users
MODIFY first_name VARCHAR(20) NOT NULL UNIQUE;
答案 0 :(得分:6)
你显然有一个阻止ALTER TABLE的外键约束。
您可以通过
前面的查询来取消激活FK检查SET FOREIGN_KEY_CHECKS=0;
但请记住在查询后将其设置为1。
SET FOREIGN_KEY_CHECKS=1;
答案 1 :(得分:0)
按照@zonzon 的建议停用 FOREIGN_KEY_CHECKS
,您可能会得到一些意想不到的结果。
该错误也可能是由于初始列架构和不完整的 ALTER TABLE
查询造成的。
如果您遇到同样的问题,我是这样解决的:
我的初始列架构是:
# users.login | varchar(128) | collate utf8_bin | not null;
ALTER TABLE users ADD login varchar(128) COLLATE 'utf8_bin' NOT NULL;
我尝试执行的操作,没有成功:
ALTER TABLE users CHANGE COLUMN login login varchar(128) NULL DEFAULT NULL;
# Cannot delete rows from table which is parent in a foreign key constraint '%s' of table '%s'
我执行的成功:
ALTER TABLE Internaute CHANGE COLUMN login login varchar(128) COLLATE 'utf8_bin' NULL DEFAULT NULL;
# This query is more complete, I indicated the column's `COLLATE`. Otherwise the default collation is applied.
为什么我的第一个查询不起作用?
在此查询中,我还更改了排序规则(更改为默认排序规则),因此我认为我的 ALTER TABLE
操作使用了 COPY
算法来处理我的请求。
使用此算法,会在某个时间点执行删除操作。这就是您可能在 Cannot delete rows from table ...
操作中得到错误 ALTER TABLE
的原因。
默认情况下,ALTER TABLE
操作使用其他算法(INSTANT
或 INPLACE
)来阻止删除步骤。但是,这些其他算法不支持更改列排序规则的 ALTER TABLE
操作。
您可以获得关于 ALTER TABLE
算法及其支持的操作的 more information here。