php工匠迁移。定义了多个主键

Posted

技术标签:

【中文标题】php工匠迁移。定义了多个主键【英文标题】:php artisan migrate. Multiple primary key defined 【发布时间】:2018-07-11 00:24:08 【问题描述】:

我的问题

我正在使用 laravel 构建我的第一个 api,并且在尝试运行 php artisan migrate 时遇到多个主键定义错误我不明白我是如何定义多个主键的。每次运行迁移时,我都会收到这些错误php artisan migrate error。

我的疑难解答

我认为由于 autoIncrementing() 只能用于可能将其定义为主键的主键,所以我将 $table->increments('bus_id')->autoIncrement()->primary(); 更改为 $table->increments('bus_id')->autoIncrement();$table->increments('bus_id')->autoIncrement();

每次我尝试运行迁移时,我都会删除我的数据库并重新创建它并尝试再次运行我的迁移(所以它每次都是一个新数据库,没有损坏的数据)但仍然没有任何区别.

我检查了上面错误代码图片中提到的 Connection.php,但没有看到与任何主键有关的任何内容。

我的问题

我的代码如下,谁能帮我理解我是如何制作双主键的?

    <?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePurchaseHistoryTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('purchase_history', function (Blueprint $table) 
            $table->increments('pur_id', 11);
            $table->string('pur_item', 255);
            $table->dateTimeTz('pur_date');
            $table->string('bus_name', 50);
            $table->double('pur_amount', 10, 2);
            $table->double('cashback_amount', 10, 2);
            $table->integer('bus_id', 11);
            $table->foreign('bus_id')->references('bus_id')->on('business');   
            $table->timestamps();
            $table->rememberToken();  
            $table->engine = 'InnoDB';  
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('purchase_history');
    

请注意这里有关于堆栈溢出的类似问题,我也尝试过他们的解决方案但没有任何成功 编辑后我仍然收到此错误:

In Connection.php line 664:

  SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto colu
  mn and it must be defined as a key (SQL: create table `purchase_history` (`pur_id` int unsigned not null auto_incre
  ment primary key, `pur_item` varchar(255) not null, `pur_date` datetime not null, `bus_name` varchar(50) not null,
  `pur_amount` double(10, 2) not null, `cashback_amount` double(10, 2) not null, `bus_id` int not null auto_increment
   primary key, `created_at` timestamp null, `updated_at` timestamp null, `remember_token` varchar(100) null) default
   character set utf8mb4 collate utf8mb4_unicode_ci engine = InnoDB)

运行 php artisan migrate:refresh 后 migrate:refresh error

business table

【问题讨论】:

$table-&gt;increments(...) 创建一个自动递增的主键字段。所以-&gt;autoIncrement()-&gt;primary() 都是多余的,可能会导致错误。 只要使用$table-&gt;increments('bus_id'); 好的,谢谢 我试试看。如果我记得,我不记得了。 @James 似乎不起作用 【参考方案1】:

试试这些

    删除increments 上的值 如果bus_id是外键,那么unsigned在添加references之前 重要提示:确保category 已在purchase_history 表和类别表auto-increment 字段之前定义/创建bus_id

$table->increments('pur_id'); 
$table->integer('bus_id')->unsigned();
$table->foreign('bus_id')->references('bus_id')->on('category'); 
                                       ^ make sure category table auto increment field value is bus_id

仅供参考:如果我绘制表格,我将 id 设置为自动增量字段上的名称。因为没有混淆。

【讨论】:

我将代码更改为 '$table->integer('bus_id', 11)->unsigned(); $table->foreign('bus_id', 11)->references('bus_id')->on('business'); ' 表上的类别列是 '$table->increments('bus_id', 11);' 我先尝试创建类别表。对不起,我想念你在那里的意思。一瞬间 我仍然会努力解决一个问题。很快会在 cmets 中更新 好的,所以我尝试通过运行php artisan migrate --path=database\migrations\2018_01_30_061115_create_business_table.php 首先使用我的(业务)表中的主键运行迁移,但我没有得到任何迁移返回。抱歉,我花了这么长时间才回复。我只是想弄清楚我做错了什么。 我想知道我很抱歉。非常感谢你。非常感谢您的帮助。【参考方案2】:

从您的 pk 定义中删除 autoincrementsprimary

$table->increments('bus_id');

文档中的定义:

自动递增 UNSIGNED INTEGER(主键)等效列。

https://laravel.com/docs/5.5/migrations#columns

编辑:

increments 方法只接受一个参数:

$table->increments('pur_id');

https://laravel.com/api/5.3/Illuminate/Database/Schema/Blueprint.html#method_increments

编辑

问题是bus_id,它也被设置为主键。来自异常:

`bus_id` int not null auto_increment primary key,

【讨论】:

我似乎仍然遇到同样的错误。我要更新我的问题以显示。在进行迁移之前,我删除了我的数据库并重新创建了它。还有什么我可能需要改变的吗? 更新了我的答案

以上是关于php工匠迁移。定义了多个主键的主要内容,如果未能解决你的问题,请参考以下文章

PHP工匠迁移不会迁移所有表[重复]

Php工匠迁移失败Laravel [重复]

PHP工匠迁移错误

PHP工匠迁移命令给出错误?

Laravel 7 迁移:语法错误或访问冲突:1068 定义了多个主键

PHP工匠迁移不创建新表