以下のコードで移行を実行すると、「外部キー制約を追加できません」というメッセージが表示されます。 誰かが私を正しい方向に向けますか?
exports.up = function(knex, Promise) {
var defer=Promise.defer();
knex.schema.createTable('User',function(table){
//--Create User Table
table.increments('UserId').primary();
table.string('username');
table.string('email',60);
table.string('password',65);
table.timestamps();
})
.then(function(){
return knex.schema.createTable('Comment',function(table){
//--Create Comment Table
table.increments('CommentId').primary();
table.string('Comment');
table.integer('UserId',11).inTable('User').references('UserId');
});
})
.then(function(){
defer.resolve();
});
return defer.promise;
};
exports.down = function(knex, Promise) {
};
mysqlを使用している可能性があると仮定すると、 UserId
が.unsigned()
であることを指定する必要があります
また、そこで延期する必要はありません。 knex.schema.createTable
を返すだけです。
exports.up = function(knex, Promise) {
return knex.schema.createTable('User',function (table){
table.increments('UserId').primary();
table.string('username');
table.string('email',60);
table.string('password',65);
table.timestamps();
})
.then(function () {
return knex.schema.createTable('Comment',function(table){
table.increments('CommentId').primary();
table.string('Comment');
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
});
});
};
Promise.defer
はほとんど必要ありません。
おお。 あなたたち最高!! 完璧に動作しました。 迅速な対応とよりクリーンなコードに関するヒントをありがとうございます:)
了解しました! data / pkフィールドとfk参照を2つの移行に分割する方が簡単な場合があります。 別の方法はここで行ったことですが、ロールバックでも順序を確認する必要があることに注意してください。
間もなくリリースされるバージョンでは、すべてのスキーマ呼び出しをチェーンできるようになり、それらは順番に実行されることが保証されます。
exports.up = function(knex, Promise) {
return knex.schema.createTable('User', function(table){
table.increments('UserId').primary();
table.string('username');
table.string('email',60);
table.string('password',65);
table.timestamps();
}).createTable('Comment',function(table){
table.increments('CommentId').primary();
table.string('Comment');
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
});
};
下への移行:
exports.down = function(knex, Promise) {
return knex.schema.dropTable('Comment').dropTable('User');
};
これを読んでいる将来の人々への参考として:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
今でしょtable.integer('UserId',11).unsigned().references('UserId').inTable('User');
ありがとう@batman!
notNullable()でエラーが発生しました。 私の外部キーは常にnullです:
例1 :) table.integer('restaurant_id').unsigned().references('id').inTable('Restaurants');
外部キー( 'restaurant_id ")は、テーブル' Restaurants 'の' id 'と一致しません。使用しようとすると、単にnullになります。
EX2 :) table.integer('restaurant_id').unsigned().notNullable().references('id').inTable('Restaurants');
エラーをスローしました(外部キー制約を追加できません)。
このフォームの外部キーの作成は、その外部キーが文字列であるが、主キー( 'id)を参照する整数を使用している場合に機能することを確認しました。 親の主キー( 'id')が整数型ではなく、デフォルト型であるためですか?
table.increments('id').primary();
外部キーが文字列型の場合に機能するのを見てきましたが、別のテーブルの主キー( 'id')への整数型参照があるとエラーがスローされます。
EX1)を使用すると、すべてが機能しているように見えますが、外部キーが自動インクリメントされないため、常にnullになります。 また、モデル関数を使用して手動でインクリメントすることもできません。 この問題はどこかで解決されましたか?
ありがとう、
アップデート:
それを理解してください、あなたはそれを外部キーにする場所とは別の行に整数列を追加する必要があります。
table.integer('restaurant_id').unsigned();
table.integer('location_id').unsigned();
table.foreign('restaurant_id').references('Restaurants.id');
table.foreign('location_id').references('Locations.id');
MySQLで外部キーを定義するときは、.unsigned()メソッドを使用する必要があることをドキュメントで明確にする価値があるかもしれません。 Objection.jsでこれを使ってみましたが、始めたばかりで一見エラーが出たので、ほとんど諦めました。 どちらのフレームワークもバグがあると思いました。
どちらのフレームワークもバグがあると思いました。
@Juanpamはそれらを使用する必要はありません。 PRは大歓迎です。 幸運を :)
@elhigu私は誰かを怒らせるつもりはありませんでした! 私は確かにフレームワークを使用しています😄。 リレーションはORMやクエリビルダーで一般的に使用される機能であるため、私のような初心者にとっては、これは一般的な問題になる可能性があると考えました。 また、MySQLは一般的なRDBMSです。
現在PRはできませんが、興味のある方は、外部キーの作成時にXAMPPMySQLを使用しようとしていました。 .primary()メソッドを使用すると、作成されたフィールドタイプはINT(11)unsignedであり、.integer()を使用して参照フィールドを作成すると、結果のフィールドタイプはINT(11)署名されるため、外部キーの作成は失敗します。 @tgriesserの修正は不思議に機能しますが、ドキュメントでこれらのような一般的な修正/問題を見つけることができればさらに良いでしょう。
とにかく、素晴らしい仕事です!
最も参考になるコメント
これを読んでいる将来の人々への参考として:
table.integer('UserId',11).unsigned().inTable('User').references('UserId');
今でしょ
table.integer('UserId',11).unsigned().references('UserId').inTable('User');