我有一个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文件导入新表。这有效! 谢谢大家的帮助!
答案 0 :(得分:1)
我认为您要做的是将test_id
字段添加到表results
的主键。
如上所述here(source question),你不能用SQLite做到这一点。
如果你想用MySQL做到这一点,你必须删除现有的主键并重新创建它(source)。
ALTER TABLE MyTable
DROP PRIMARY KEY,
ADD PRIMARY KEY (old_col1, old_col2, new_col);