无法使用外键添加新列

时间:2017-04-28 09:31:52

标签: mysql

我有一个MySQL表,现在我想添加一个带有主键和外键的新列。

到目前为止我尝试了什么

表格如何:

CREATE TABLE IF NOT EXISTS `results` (
  `id` int(20) NOT NULL UNIQUE AUTO_INCREMENT,
  `resultA_id` int(20) NOT NULL,
  `resultB_id` int(20) NOT NULL,
  `resultC_id` int(20) NOT NULL,
  `resultD_id` int(20) NOT NULL,
  `resultE_id` int(20) NOT NULL,
  `resultF_id` int(20) NOT NULL,
  FOREIGN KEY (resultA_id) REFERENCES resultA(id),
  FOREIGN KEY (resultB_id) REFERENCES resultB(id),
  FOREIGN KEY (resultC_id) REFERENCES resultC(id),
  FOREIGN KEY (resultD_id) REFERENCES resultD(id),
  FOREIGN KEY (resultE_id) REFERENCES resultE(id),
  FOREIGN KEY (resultF_id) REFERENCES resultF(id),
  PRIMARY KEY (`resultA_id`, `resultB_id`, `resultC_id`, `resultD_id`, `resultE_id`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin;

如何例如结果表格看起来像

CREATE TABLE IF NOT EXISTS `resultA` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin;

现在我想在结果中添加一个新列,它与一个名为table_test的新表有关系。因此,我创建了一个新的table_test

CREATE TABLE IF NOT EXISTS `table_test` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL UNIQUE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin;

为结果添加了新列

ALTER TABLE results ADD COLUMN test_id;

现在我想添加一个主键

ALTER TABLE `results` ADD PRIMARY KEY(`test_id`);

我收到了这个错误

Cannot drop index 'PRIMARY': needed in a foreign key constraint

我还试图在这里添加这样的外键

ALTER TABLE `results` ADD  CONSTRAINT `results_ibfk_7` FOREIGN KEY (`test_id`) REFERENCES `table_test`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

而且我得到了这个错误

Cannot add or update a child row: a foreign key constraint fails

我试图忽略这里的外键检查

SET FOREIGN_KEY_CHECKS=0

但这没有用。

我还尝试使用新列创建一个新表,然后尝试将旧表中的数据复制到新表中

INSERT INTO results_new SELECT * FROM results;

我在这里也遇到了这个错误

Cannot add or update a child row: a foreign key constraint fails

我能做什么或我在这里做错了什么?

修改 我现在做的是什么。使用新列和外键等创建新表。将旧表转储为CSV文件。编辑此CSV文件并将新值添加到csv文件中的每一行。将此CSV文件导入新表。这有效! 谢谢大家的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您要做的是将test_id字段添加到表results的主键。

如上所述heresource question),你不能用SQLite做到这一点。

如果你想用MySQL做到这一点,你必须删除现有的主键并重新创建它(source)。

ALTER TABLE MyTable
  DROP PRIMARY KEY,
  ADD PRIMARY KEY (old_col1, old_col2, new_col);