我有两个表,交易和付款,它们在过去的迁移中已经存在。 当我尝试在它们之间创建数据透视表时,我只收到事务的外键错误。 另一个外键,在"付款"表上,创建得很好。 这绝对让我感到困惑,我之前发现的关于此错误的讨论都没有解决问题。
错误(作为参考,MAccount 是数据库的名称):
[Illuminate''Database''QueryException] SQLSTATE[HY000]: 一般错误: 1005 无法创建表 'MRAccounting.#sql- 563_2d7' (errno: 150) (SQL: alter table 'payment_transaction' add conlimit t payment_transaction_transaction_id_foreign外键("transaction_id") 引用"交易"("ID"))
*尽管错误似乎在说什么,payment_transaction表与支付表的外键一起成功创建;唯一中断的是交易的外键。
交易表:
使用照明''数据库''迁移''迁移; 使用照明''数据库''模式''蓝图; 类 CreateTransactionsTable 扩展迁移 { /** * 运行迁移。 * * @return无效 */ 公共函数 up() { Schema::create('transactions', function(Blueprint $table) { $table->增量('id'); $table->字符串("名称"); $table->十进制("余额",7,2); $table->整数('account_id'); $table->整数('pending_id'); $table->时间戳(); }); }/** * 反向迁移。 * * @return无效 */ 公共函数 down() { Schema::d rop('transactions'); } }
付款表:
使用照明''数据库''迁移''迁移; 使用照明''数据库''模式''蓝图; 类 CreatePaymentsTable 扩展迁移 { /** * 运行迁移。 * * @return无效 */ 公共函数 up() { Schema::create('payments', function(Blueprint $table) { $table->增量('id'); $table->整数('account_to'); $table->整数('account_from'); $table->十进制("金额",7,2); $table->时间戳(); }); }/** * 反向迁移。 * * @return无效 */ 公共函数 down() { 模式::d rop('付款'); } }
数据透视表:
使用照明''数据库''迁移''迁移; 使用照明''数据库''模式''蓝图; 类 CreatePaymentTransactionTable 扩展迁移 { /** * 运行迁移。 * * @return无效 */ 公共函数 up() { Schema::create('payment_transaction', function(Blueprint $table) { $table->增量('id'); $table->无符号整数('payment_id'); $table->无符号整数('transaction_id'); $table->时间戳(); $table->外国('payment_id')->参考('id')->on('付款'); $table->外国('transaction_id')->引用('id')->on('交易'); }); Schema::table('payment_transaction', function(Blueprint $table){ $table->外国('payment_id')->参考('id')->on('付款'); $table->外国('transaction_id')->引用('id')->on('交易'); });}/** * 反向迁移。 * * @return无效 */ 公共函数 down() { Schema::d rop('payment_transaction'); } }****
**不幸的是,全新安装解决了这个问题。 这很好,而且很花哨,我现在可以继续开发,但是像这样进行全新安装不一定是我在生产环境中的便利。 我需要弄清楚是什么原因造成的/如何重新创建它。
您可以通过
制作INT(10) unsigned
类型的payment_transaction.payment_id
来修复所有这些混乱。 在这种情况下,payments.id
INT(10) AUTO_INCREAMENT
将是相等的,您的引用将起作用。
在主键和外键上使用标志 unsigned()。
对于数据透视表,请使用以下迁移:
public function up() {
Schema::create('payment_transaction', function(Blueprint $table) {
$table->increments('id');
$table->unsignedBigInteger('payment_id');
$table->foreign('payment_id')->references('id')->on('payments');
$table->unsignedBigInteger('transaction_id');
$table->foreign('transaction_id')->references('id')->on('transactions');
});
}
你为什么不试试这个:
$table->integer('payment_id')->unsigned();
$table->integer('transaction_id')->unsigned();