更改表错误代码1834

时间:2013-10-07 09:13:37

标签: mysql

我正在尝试按如下方式更改表格。但我收到错误代码:

  

1834无法从外键约束中删除父表中的行' downloads_ibfk'表下载。

ALTER TABLE users
MODIFY first_name VARCHAR(20) NOT NULL UNIQUE;

2 个答案:

答案 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 操作使用其他算法(INSTANTINPLACE)来阻止删除步骤。但是,这些其他算法不支持更改列排序规则的 ALTER TABLE 操作。

您可以获得关于 ALTER TABLE 算法及其支持的操作的 more information here