2

我正在运行 MySQL 5.1.54-lubuntu4

我有一张桌子

CREATE TABLE `mcli` (
  `id` bigint(20) NOT NULL,
  `pr_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FK7617032AB07F537D` (`id`),
  KEY `FK7617032A4007E4D7` (`pr_id`),
  CONSTRAINT `FK7617032AB07F537D` FOREIGN KEY (`id`) REFERENCES `acli` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

这个表里面有数据。

我还有一张桌子

CREATE TABLE `PR` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `frequency` varchar(255) DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKPRtoAR` (`id`),
  CONSTRAINT `FKPRtoAR` FOREIGN KEY (`id`) REFERENCES `AR` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 

该表中也有数据。

mcli.pr_id (table mcli, field id) 的所有行中的数据都是 pr.id 中的有效条目(因为在我将 OLDPR 表迁移到 PR 之前,它们曾经在另一个表 OLDPPR 中。实际上是 mcli.pr_id曾经有一个指向 OLDPR.id(旧表的 id 字段)的外键。

我想添加一个将 mcli.pr_id 与 PR.id 联系起来的外键约束。从架构中可以看出,我已经在 mcli.pr_id 上创建了一个名为 FK7617032A4007E4D7 的索引。所以我尝试运行命令来生成外键约束。

mysql> ALTER TABLE `mcli` ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES `PR` (`id`);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES ' at line 1
mysql> 

我还尝试从 mcli 刷新所有数据并重新运行命令以添加外键约束,但它仍然给出了相同的错误。我试过单引号,没有引号。网络上的一切都表明我有正确的语法。我究竟做错了什么?

我很感激我能得到的任何帮助。

4

1 回答 1

1

这只是一个有根据的猜测,我没有测试它的环境。

解析器可能会因为已经有一个同名的键而感到困惑,这也会导致语法错误,即使严格来说,语法是好的。

尝试使用另一个约束名称,只是为了验证行为。

然后,尝试删除此密钥:

KEY `FK7617032A4007E4D7` (`pr_id`),

在添加约束之前:

ALTER TABLE `mcli` ADD CONSTRAINT `FK7617032A4007E4D7` FOREIGN KEY (`pr_id`) REFERENCES `PR` (`id`);

我无法在更新的 5.1 版本上重现这一点。

于 2012-10-05T15:47:04.967 回答