2016-09-07 3 views
2

Я пытаюсь создать связь между двумя таблицами, однако, похоже, некоторые проблемы возникают, когда я пытаюсь вставить свой объект в базу данных postgres. Я продолжаю получать следующую ошибку: insert or update on table "tournament" violates foreign key constraint "tournament_league_id_foreign". который, я думаю, связан с моим синтаксисом knex?столкнулся с нарушением внешних ключей

вставки в БД

 var data = { 
      id: id, 
      name: name, 
      league_id: leagueId 
     }; 

     var query = knex('tournament').insert(data).toString(); 
     query += ' on conflict (id) do update set ' + knex.raw('name = ?, updated_at = now()',[name]); 

     knex.raw(query).catch(function(error) { 
     log.error(error); 
     }) 

Knex столы

knex.schema.createTable('league', function(table) { 
    table.increments('id').primary(); 
    table.string('slug').unique(); 
    table.string('name'); 
    table.timestamp('created_at').notNullable().defaultTo(knex.raw('now()')); 
    table.timestamp('updated_at').notNullable().defaultTo(knex.raw('now()')); 
}), 
knex.schema.createTable('tournament', function(table) { 
    table.string('id').primary(); 
    table.integer('league_id').unsigned().references('id').inTable('league'); 
    table.string('name'); 
    table.boolean('resolved'); 
    table.timestamp('created_at').notNullable().defaultTo(knex.raw('now()')); 
    table.timestamp('updated_at').notNullable().defaultTo(knex.raw('now()')); 
}) 
+0

Что вы подразумеваете под "migrate"? – redneb

+0

Извините за путаницу. не миграция! я редактировал вопрос –

ответ

3

Когда вы создали tournament таблицу, в столбце league_id вы вы указали, что .references('id').inTable('league'). Это означает, что для каждой строки в этой таблице должна существовать строка в таблице , чья id такая же, как и значение поля league_id в предыдущей строке. Видимо, в вашей вставке (это ваша единственная вставка?) Вы добавляете строку в tournament, у которой league_id не существует в . Как правило, внешнее ограничение (т. Е. Часть .references) подразумевает, что вы должны создать лигу сначала, а затем турниры в этой лиге (что на самом деле имеет смысл).

Смежные вопросы