当前位置: 首页 > 知识库问答 >
问题:

对字符串问题的Laravel外键迁移引用

子车凌龙
2023-03-14

我想知道是否有可能在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`add constraint account\ U roles\ U level\ U外键(`acc\ U roles\ U level`)在更新级联上引用`roles`(`level`)在删除上设置null在更新级联上)

我不知道为什么我不能引用字符串列。同时,我在mysql上成功地运行了这段代码,没有出现错误:altertableaccountaddforeignkey acc\u roles\u level references roles(level)

有没有人遇到过类似的问题?

共有2个答案

周弘盛
2023-03-14

经过大量的搜索,我改变了我的表def

用户表

public function up()
{
Schema::create('users', function (Blueprint $table) {
  $table->string('user_id');
  $table->string('short_name');
  $table->string('display_name');
  $table->string('username');
  $table->string('email');
}

public function up()
{
Schema::create('users', function (Blueprint $table) {
  $table->engine = 'InnoDB'; // <- add this
  $table->string('user_id')->primary(); // <- and this
  $table->string('short_name');
  $table->string('display_name');
  $table->string('username');
  $table->string('email');
}

bonus_user表

public function up()
{
Schema::create('bonus_user', function (Blueprint $table) {
  $table->engine = 'InnoDB';
  $table->string('bonus_id');
  $table->string('user_id');
});

Schema::table('bonus_user', function (Blueprint $table) {
  $table->foreign('bonus_id')->references('bonus_id')->on('bonuses')->onDelete('cascade');
  $table->foreign('user_id')->references('user_id')->on('users')->onDelete('cascade');
});

}

我从这里得到的innoDB解决了laravel外键迁移参考字符串问题(见答案2)

primary()我从这里得到,在这里输入链接描述(尽管我没有遵循答案的任何其他部分,因为我必须将我的主键作为字符串,因为它是作为24个字符的字符串提供给我的!)

我认为这两个变化是协同工作的,因为它不仅仅与InnoDB引擎变化一起工作。

迁移顺序也可能是解决方案的一部分,但作为我的bonus_user表,引用这个外键是在原始用户表迁移后生成的,创建顺序问题对我来说不是问题!

在我添加主()到user_id列后,它第一次工作了!

东博瀚
2023-03-14

您必须更改迁移顺序

|-database/
|--migrations/
|---2015_02_02_141725_create_account_table.php
|---2015_03_01_234626_create_roles_table.php

应该是:

|-database/
|--migrations/
|---2015_01_01_234626_create_roles_table.php
|---2015_02_02_141725_create_account_table.php

最后:

php artisan migrate
 类似资料:
  • 我必须定义code.Spatial类,如主键和codels.LScharacteristic codels.PlannedUsing,如外键。当我尝试migrate:ProgrammingError:ERROR:foreign key约束中指定的id列不存在时,我遇到了这个问题。 UPD完整日志:上述异常是以下异常的直接原因: 回溯(最后一次调用):文件“manage.py”,第23行,从命令行执

  • Laravel5.6运行于:PHP7.2,MariaDB 10.3 当我想为我的表设置外键时,我只是不断地犯这个错误。 在其他表中,由Laravel本身定义的所有id变量和无符号自动增量 所以,我的迁移是这样的: 错误如下所示: SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解在LINE 1(SQL:alter

  • 我花了一整天的时间试图弄清楚下面的迁移发生了什么。 这是表的迁移。我的想法是使用“id_stays_abroad”和“user_id”作为外键。 这是添加外键的另一个迁移 当我运行php artisan迁移时,我遇到了以下错误: SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table

  • 我创建了一个名为用户的表。有一些表被称为公司、名称、部门。我想添加company_id,designation_id,department_id列到用户表作为外键。 我试过了,但没用 当我迁移迁移时,它会显示此错误。 Illumb\Database\QueryException:SQLSTATE[HY000]:一般错误:1005无法创建表(错误号:150“外键约束格式不正确”)(SQL:alter

  • 我想在用户表中添加一个外键: 一个用户有一个城镇(法语为ville),一个城镇可以有多个用户: 我的村庄(城镇)迁移 我重命名了迁移(我不知道这样做是否有好处?),这是我迁移的顺序,正如您所看到的,我在用户之前创建了villes: 我在终端中发现了这个错误: 照亮\数据库\查询异常 SQLSTATE[42000]:语法错误或访问冲突:1072键列“villes\u id”在表中不存在(SQL:al

  • 我有两个表,事务表和付款表,它们在过去的迁移中已经存在。当我试图在它们之间建立一个透视表时,只会得到事务外键的一个错误。“payments”表上的另一个外键创建得很好。这绝对让我感到困惑,我之前关于这个错误的讨论都没有解决这个问题。 错误(参考,MAccounting是数据库的名称): *尽管错误似乎说,payment_transaction表创建成功,以及支付表的外键;唯一中断的是交易的外键。