这个问题在这里已有答案:
- MySQL Errno 150 9个答案
我试图将一些文件迁移到数据库(phpmyadmin),但是我'm getting this error: [Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1005 Can' t创建表'loja.#sql-38f_25f'(错误号:150)(SQL:alter table encomenda
add c onstraint encomenda_username_foreign foreign key( username
)references users
( username
))
这是我的表“encomenda”:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEncomendaTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Creates the encomenda table
Schema::create('encomenda', function($table)
{
$table->engine = 'InnoDB';
$table->increments('IDEncomenda')->unsigned();
$table->integer('id')->unsigned();
$table->foreign('id')->references('id')->on('users')->onDelete('cascade');
$table->string('editora');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('encomendas');
}
}
在错误消息中,它表示它无法创建表'loja',但没有在此文件中的位置引用'loja' . 我确实想创建一个表'loja',以防万一,这是代码:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLojaTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('loja', function($table)
{
$table->engine = 'InnoDB';
$table->primary('api_key');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('loja');
}
}
用户表迁移:
<?php
use Illuminate\Database\Migrations\Migration;
class ConfideSetupUsersTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Creates the users table
Schema::create('users', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id')->unsigned();
$table->string('username')->unique();
$table->string('email');
$table->string('password');
$table->string('confirmation_code');
$table->string('remember_token')->nullable();
$table->boolean('confirmed')->default(false);
$table->boolean('admin')->default(false);
$table->timestamps();
});
// Creates password reminders table
Schema::create('password_reminders', function($table)
{
$table->engine = 'InnoDB';
$table->string('email');
$table->string('token');
$table->timestamp('created_at');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('password_reminders');
Schema::drop('users');
}
}
现在这是我的表'linhaItem'迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLinhaItemTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('linhaItem', function($table)
{
$table->engine = 'InnoDB';
$table->increments('IDLinha')->unsigned();
$table->integer('IDDisco')->unsigned();
$table->integer('IDCarrinho')->unsigned();
$table->double('preco');
$table->integer('quantidade');
$table->foreign('IDDisco')->references('IDDisco')->on('disco')->onDelete('cascade');
$table->foreign('IDCarrinho')->references('IDCarrinho')->on('carrinho')-onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('linhaItem');
}
}
谁知道什么是错的?
编辑:我添加了 - > onDelete('cascade')到外键,但我得到了同样的错误 .
EDIT2:我在'encomenda'文件的id列中添加了unsigned,但现在我已经'm still getting the same error, but with the ' linhaItem'表迁移了 .
2 回答
你有几个问题:
users
迁移:$table->unique('username');
语句用于创建唯一索引,而不是列:http://laravel.com/docs/4.2/schema#adding-indexes将其更改为:
$table->string('username')->unique();
- 这将为其添加列和唯一索引 .encomenda
迁移:$table->string('username')->unsigned();
:unsigned
仅用于整数,不能使字符串无符号 .使用与
users
migration中相同的代码:$table->string('username')->unique();
我解决了这个问题 . 问题是我正在尝试迁移表,这些表具有尚未迁移的表的外键 . 我刚刚重命名了所有文件,以便将它们放入可行的顺序中 .