【发布时间】:2015-03-31 15:27:53
【问题描述】:
我想知道是否有可能在 laravel 迁移中添加字符串引用的外键。所以,我在第一次文件迁移时有这个代码。
public function up()
{
// roles table
Schema::create('roles', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('level')->unsigned();
$table->string('title');
$table->unique('level');
});
// account table
Schema::create('account', function(Blueprint $table)
{
$table->increments('id');
$table->integer('acc_no');
$table->string('acc_username');
$table->string('acc_password');
$table->integer('acc_roles_level')->unsigned();
$table->softDeletes();
$table->timestamps();
$table->unique('acc_username');
});
然后在第二个迁移文件我有这个代码:
public function up()
{
Schema::table('account', function(Blueprint $table)
{
$table->foreign('acc_roles_level')
->references('level')->on('roles')
->onUpdate('cascade')
->onDelete('set null');
});
}
迁移运行时显示错误:
SQLSTATE[HY000]:一般错误:1215 无法添加外键约束(SQL:alter table `account` 添加约束 account_acc_roles_level_foreign 外键(`acc_roles_level`)在删除时引用`roles`(`level`)在更新时设置为空级联)更新级联)
我不知道为什么我不能引用字符串列。同时,我在mysql上成功运行了这段代码,没有错误:
alter table account add foreign key acc_roles_level references roles(level)
有没有人遇到过类似的问题?
【问题讨论】:
-
您不应该在各自的表中同时将
acc_roles_level和level都设为未签名吗? -
@NomanUrRehman 是的,当然,我都没有签名。
-
我认为问题是
level列不是roles表中的主键,您将其添加为外键。外键不应该是自己表中的主键吗? -
@NomanUrRehman 不一定。外键可以引用任何唯一的列,即使它不是主键。
-
我也看到了很多这种实现的例子。但是,它主要只是将外键引用到整数类型。有没有可能我可以将它引用到字符串类型列?
标签: php mysql laravel database-migration