javascript - 列违反外键约束

标签 javascript node.js postgresql knex.js

我正在尝试在两个表之间创建关系,但是当我尝试将对象插入 postgres 数据库时,我似乎遇到了一些问题。我不断收到以下错误:在表“tournament”上插入或更新违反了外键约束“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()'));
})

最佳答案

当您创建tournament表时,您为league_id列指定了.references('id').inTable('league')。这意味着对于该表中的每一行,表 league 中必须存在一行,其 idleague_id 的值相同> 前一行中的字段。显然,在您的插入中(这是您唯一的插入吗?),您正在向 tournament 添加一行,其 league_idleague 中不存在。通常,外部约束(即 .references 部分)意味着您必须首先创建联赛,然后在该联赛中创建锦标赛(这实际上是有意义的)。

关于javascript - 列违反外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39374265/

相关文章:

Javascript:在 jQuery 中使用 xpath

node.js - Mongoose :中间件预删除选项不起作用

javascript - res.render sweetalert 在 ejs 文件上

arrays - 从结果集中检索列表数据并转换为 JSON

javascript - vue-fullcalendar - css 类和换行符不起作用

javascript - 使用 Javascript 更改按钮文本

database - 如何利用 PostgreSQL DDL 解析器?

java - 在 PostgreSQL 中加入两个查询

java - 如何编写 JavaScript 函数来检查 JRE 版本

node.js - 我可以直接从 node.js 运行 .coffee 文件吗?