Knex / 反对插入时“重复键值违反唯一约束”

GN.*_*GN. 1 knex.js objection.js

exports.seed = async function(knex, Promise) {
  await knex.raw('TRUNCATE TABLE posts RESTART IDENTITY CASCADE')
  await knex.raw('TRUNCATE TABLE users RESTART IDENTITY CASCADE')
}
Run Code Online (Sandbox Code Playgroud)

和一些种子数据....

const faker = require('faker')

const post = [
  {
    id: 1,
    title: faker.lorem.words(),
    body: '12 - 10',
    answers: '[12]',
    user_id: 1
  },
  {
    id: 2,
    title: faker.lorem.words(),
    body: '12 - 10 + 123',
    answers: '[12]',
    user_id: 1
  },
  {
    id: 3,
    title: faker.lorem.words(),
    body: '12 - 10 / 901',
    answers: '[12]',
    user_id: 1
  }
]

exports.seed = (knex, Promise) => {
  // Deletes ALL existing entries
  return knex('post').then(() => {
    // Inserts seed entries
    return knex('post').insert(post)
  })
}
Run Code Online (Sandbox Code Playgroud)

一个简单的更新方法

export async function update(req, res) {
  try {
    const user = await currentUser()
    const params = req.body
    await Post.query()
      .findById(req.params.id)
      .where('user_id', user.id)
      .patch({ ...params, user_id: user.id })

    return res.json({ success: true })
  } catch (err) {
    return res.status(500).json({ message: 'Something went wrong' })
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在测试中插入时,得到一个 duplicate key value violates unique constraint

即使从种子创建的测试数据的 id 为[1,2,3],插入也会抱怨主数据已被使用。为什么是这样?数据库不应该选择下一个可用的 id 吗?

exports.up = async function(knex) {
  await knex.schema.alterTable('posts', (t) => {
    t.integer('user_id')
      .unsigned()
      .references('users.id')
  })
}

exports.down = async function(knex) {
  await knex.schema.table('posts', (t) => {
    t.dropColumn('user_id')
  })
}
Run Code Online (Sandbox Code Playgroud)

编辑

即使只插入 SQL .. 也有错误:

INSERT INTO calcs (title, answers, user_id) VALUES ('tester', '[123]', 1);

结果是:`重复键值违反了唯一约束posts_pkey'

我不只是使用 knexdel()调用的原因是因为我在删除带有外键引用的表时遇到错误..

Mik*_*stö 5

当您从种子插入数据时,您还将id列值传递给数据库。

这会导致您id sequence的主键在您播种初始插入时不会增加

现在,当您尝试插入更多数据时,播种后id sequence仍会返回从 1 开始的 ID。

您应该在播种期间将您的 id 序列设置为正确的值,如本答案中所述如何重置 postgres 中的序列并用新数据填充 id 列?