Knex迁移种子完成时出现外键错误

时间:2014-12-05 22:52:53

标签: javascript mysql node.js knex.js

我从一个看起来像这样的数组中播种我的数据库(单词和定义有多对多关系):

var seeds = [
{
    "word": "Click",
    "definitions": ["Computer", "Mouse", "Tasto", "Pulsante", "Selezionare"]
}, {
    "word": "Galoppo",
    "definitions": ["Cavallo", "Andatura", "Trotto", "Ippica", "Passo"]
}, {
    "word": "Raggio",
    "definitions": ["Sole", "Bicicletta", "Diametro", "Luce", "Laser"]
}, {
.
.
.goes on for 1089 objects

这就是我的尝试:

exports.seed = function (knex, Promise) {
var promises = seeds.map(function (seed) {
    return knex('words').insert({
        word: seed.word
    }, 'id').then(function (word_id) {
        var promises = seed.definitions.map(function (definition) {
            return knex('definitions').insert({
                definition: definition
            }, 'id').catch(function (err) {
                if (err.code === 1062)
                    return knex('definitions').select('id').where({
                        definition: definition
                    }).then(function (duplicate) {
                        return knex('definitions_words').insert({
                            definition_id: duplicate[0].id,
                            word_id: word_id
                        });
                    });
            }).then(function (definition_id) {
                return knex('definitions_words').insert({
                    definition_id: definition_id,
                    word_id: word_id
                });
            });
        });
        return Promise.all(promises);
    });
});
return Promise.all(promises);
};

单词在我的种子中是唯一的,但定义可能会重复,所以我抓住重复错误并获取副本的id以将其放入联结表中。它似乎工作正常,连接表实际上最终得到1089 * 5行(5445),但我在cli上得到一个错误:

Error: Cannot add or update a child row: a foreign key constraint fails 
(`mytable`.`definitions_words`,
CONSTRAINT `definitions_words_definition_id_foreign`
FOREIGN KEY (`definition_id`) REFERENCES `definitions` (`id`))

1 个答案:

答案 0 :(得分:0)

虽然我们无法看到您的迁移(这是一个相当古老的问题),这些外键限制通常会导致您在definition_id中定义words以引用{{ 1}}。因此,您无法在definitions.id引用存在之前创建word

没有测试,也没有错误检查,我想你会使用更像这样的东西:

definition