【问题标题】:How to create multiple primary key with auto_increment include in laravel migrations?如何在 laravel 迁移中创建包含 auto_increment 的多个主键?
【发布时间】:2014-05-28 22:51:40
【问题描述】:

我刚接触 Laravel。我在进行迁移时遇到问题。我的Schema是这样的

public function up()
{
    Schema::create('journal', function($table){
        $table->increments('id');
        $table->timestamp('journal_date');
        $table->string('no_ref',25);
        $table->string('acc_id', 10);
        $table->string('description', 100);
        $table->integer('debet')->default(0);
        $table->integer('kredit')->default(0);
        $table->primary(array('journal_date', 'no_ref', 'acc_id'));
    });
}

然后在运行 PHP artisan migrate 时出现错误

[Illuminate\Database\QueryException]                                                                                                                                                            
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key 
defined (SQL: alter table `journal` add primary key 
journal_journal_date_no_ref_acc_id_primary(`journal_date`,   
`no_ref`, `acc_id`))    

我向drop primary 提出了一些建议,但这也会降低自动增量。就是不知道怎么弄。

【问题讨论】:

标签: php laravel-4


【解决方案1】:

终于,我找到了答案。我刚刚使用过这样的 DB::statement

                DB::statement('ALTER TABLE  `journal` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` ,  `journal_date` ,  `no_ref` ,  `acc_id` ) ;');

我的问题解决了。

【讨论】:

    【解决方案2】:

    我找到了这个解决方案,请跟进。创建主键的小改动。

    public function up()
    {
    //
        Schema::create('journal', function($table){
            $table->unsignedInteger('id');
            $table->timestamp('journal_date');
            $table->string('no_ref',25);
            $table->string('acc_id', 10);
            $table->string('description', 100);
            $table->integer('debet')->default(0);
            $table->integer('kredit')->default(0);
            $table->primary(array('id', 'journal_date', 'no_ref', 'acc_id'));
        });
    }
    

    【讨论】:

      【解决方案3】:

      自动增量字段必须是键(例如,如果它不是键,MySQL 甚至不允许您定义 auto_increment 列)。这可能就是您不能简单地删除密钥的原因。在删除之前为该字段定义第二个密钥。 ($table->increments('id')->unique();)。

          public function up() {
          Schema::create('journal', function($table) {
              $table->increments('id')->unique();
              $table->timestamp('journal_date');
              $table->string('no_ref', 25);
              $table->string('acc_id', 10);
              $table->string('description', 100);
              $table->integer('debet')->default(0);
              $table->integer('kredit')->default(0);
      
          });
          Schema::table('journal', function($table) {
              $table->dropPrimary('id');
              $table->primary(['journal_date', 'no_ref', 'acc_id']);
          });
      }
      

      【讨论】:

      • 欢迎来到 StackOverflow。您能否描述一下您的代码是如何工作的?这样,偶然发现您的答案的人就明白它在做什么以及它是如何做到的?请阅读this article 以更好地了解答案是什么。也请浏览网站tour
      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 2014-05-30
      • 2012-12-21
      • 2023-03-19
      • 2018-05-16
      • 2016-12-16
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多