为什么我无法在MySql表上删除此外键约束?

时间:2017-04-28 17:39:07

标签: mysql database rdbms

我不是那么进入数据库而且我有以下问题。我正在使用 MySql

我有一个结果表,由 DDL 声明描述:

CREATE TABLE results (
  id        BigInt(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  sample_id BigInt(20) UNSIGNED NOT NULL,
  genus     VarChar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
  doi       NVarChar(128) COLLATE utf8_general_ci,
  result    NVarChar(2) COLLATE utf8_general_ci NOT NULL,
  error     Text CHARACTER SET utf8 COLLATE utf8_general_ci, 
  PRIMARY KEY (
      id
  )
) ENGINE=InnoDB AUTO_INCREMENT=3 ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE results COMMENT = '';
ALTER TABLE results ADD CONSTRAINT fk_results_pgrfas FOREIGN KEY (sample_id)
  REFERENCES pgrfas (id)
  ON DELETE NO ACTION 
  ON UPDATE NO ACTION;
CREATE INDEX fk_results_pgrfas 
 ON results(sample_id);

正如您在此表中所看到的,定义了一个 FOREIGN KEY constratint将结果表与另一个名为 pgrfas 的表绑定在一起。

我必须删除此foreing键约束,我尝试使用此语句:

alter table results drop foreign key fk_results_pgrfas

但它不起作用,MySql会回复此错误消息:

#42000Can't DROP 'fk_results_pgrfas'; check that column/key exists

有什么问题?我错过了什么?如何正确删除此FK?

编辑1:声明:

SHOW CREATE TABLE results;

返回:

CREATE TABLE `results` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sample_id` bigint(20) unsigned NOT NULL,
  `genus` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `doi` varchar(128) CHARACTER SET utf8 DEFAULT NULL,
  `result` varchar(2) CHARACTER SET utf8 NOT NULL,
  `error` text CHARACTER SET utf8,
  PRIMARY KEY (`id`),
  KEY `fk_results_pgrfas` (`sample_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

那意味着什么?已删除?但这部分意味着什么:

KEY `fk_results_pgrfas` (`sample_id`)

4 个答案:

答案 0 :(得分:2)

检查结果和pgrfas表:

SELECT * FROM results;
SELECT * FROM pgrfas;

如果可以,请从表中删除值。

运行SHOW CREATE TABLE并验证正确的外键名称。 删除外键

ALTER TABLE results DROP FOREIGN KEY fk_results_pgrfas;

您创建了一个与外键名称相同的INDEX。

我认为它没有关系,但是如果你有问题,请尝试删除你的索引,然后删除外键。
删除关联的INDEX:

DROP INDEX fk_results_pgrfas ON results;

答案 1 :(得分:1)

根据show create table输出,您没有名为fk_results_pgrfas的外键constaint。相反,您有一个索引fk_results_pgrfas。 如果您确实要删除/删除此索引,请运行以下查询。

ALTER TABLE `results` DROP INDEX `fk_results_pgrfas`;

另一方面,您确定已成功执行了以下2个命令吗?因为这两个命令正在为result表创建重复键。

ALTER TABLE results ADD CONSTRAINT fk_results_pgrfas FOREIGN KEY (sample_id)
  REFERENCES pgrfas (id)
  ON DELETE NO ACTION 
  ON UPDATE NO ACTION;
CREATE INDEX fk_results_pgrfas 
 ON results(sample_id);

答案 2 :(得分:0)

检查确实存在哪种约束

C::a()

如果存在,最好放弃约束:

SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE
        TABLE_NAME        = 'results' AND
        CONSTRAINT_NAME   = 'fk_results_pgrfas' AND
        CONSTRAINT_TYPE   = 'FOREIGN KEY'

答案 3 :(得分:0)

你能不能运行SHOW CREATE TABLE结果;确保外键约束的名称并使用您获得的名称运行命令?

ALTER TABLE结果DROP FOREIGN KEY<>