web-dev-qa-db-ja.com

Knex主キーの自動インクリメント

私はknexを使用してpostgresデータベースに単純なテーブルを作成しています:

_function up(knex, Promise) {
return knex.schema.createTableIfNotExists('communities', (table) => {

    table.increments('id').primary().unsigned();

    table.string('name', 255).notNullable();
    table.string('slug', 100).notNullable();

    table.timestamp('createdAt').defaultTo( knex.fn.now() );
    table.timestamp('updatedAt');
});
_

};

_function down(knex, Promise) {
  return knex.schema.dropTableIfExists(tableName);
};

module.exports = {
    tableName,
    up,
    down
}
_

私の問題は、table.increments('id').primary()がデフォルト値にnextval('communities_id_seq'::regclass)を持つ主キーを作成し、IDなしで挿入を実行できないことです(生のSQLでも)。

デフォルトでIDをインクリメントする方法を知っている人はいますか?

8
J.D.

私の問題は、idの値が空の文字列であり、undefinedまたはnullではないため、データ型としての整数の制約が解消されることでした。

それが役に立てば幸い!

2
J.D.

Jsの場合:table.increments()

出力SQL:id int unsigned not null auto_increment primary key

詳細についてはこちらをご覧ください

2
Beknazar

パーティーに少し遅れましたが、同じユースケースでこの問題が発生していました。ただし、私の解決策は、シーケンスにすべての正しいアクセス許可が付与されておらず、DBを停止したときのテーブルのみが付与されていたことです。

つまり、"GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO PUBLIC"の線に沿った何か

1
Lachlan Young