2015-08-21 19 views
14

Ben yii migrate kaçmaya çalıştı, ancak aşağıdaki hatayı gösterdi: İşteYii2'de geçişi kullanarak bileşik birincil anahtar nasıl oluşturulur?

create table news-cate ...Exception: SQLSTATE[42000]: Syntax error or access violation: 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key 
The SQL being executed was: CREATE TABLE `news-cate` (
     `news-id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     `cate-id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY 

benim kodudur:

class m150821_083020_create_newscate_table extends Migration 
{ 
    public function safeUp() 
    { 
     $this->createTable('news-cate', [ 
      'news-id' => $this->primaryKey(), 
      'cate-id' => $this->primaryKey(), 
     ]); 
     $this->addForeignKey("fk_news_cate_nid", "news-cate", "news-id", "news", "id", "RESTRICT", "CASCADE"); 
     $this->addForeignKey("fk_news_cate_cid", "news-cate", "cate-id", "category", "id", "RESTRICT", "CASCADE"); 
    } 

    public function safeDown() 
    { 
     echo "m150821_083020_create_newscate_table cannot be reverted.\n"; 
     $this->dropTable("news-cate"); 
     return false; 
    } 
} 

Yani Yii2 Göç kullanarak bileşik birincil anahtar oluşturmak için nasıl?

<?php 
use yii\db\Migration; 
... 
$this->createTable('news-cate', [ 
    'news-id' => $this->integer()->notNull(), 
    'cate-id' => $this->integer()->notNull(), 
]); 
$this->addPrimaryKey('news-cate_pk', 'news-cate', ['news-id', 'cate-id']); 
... 
?> 

ORİJİNAL CEVAP

Don':

cevap

16

GÜNCELLEME

deneyin t Sadece türlerini beyan, tablo oluşturma birincil anahtarları ekleyin: Bundan sonra

use yii\db\Schema; 

,,, 

$this->createTable('news-cate', [ 
    'news-id' => Schema::TYPE_INTEGER . ' NOT NULL', 
    'cate-id' => Schema::TYPE_INTEGER . ' NOT NULL', 
]); 

böyle kompozit birincil anahtar ekleyebilirsiniz:

$this->addPrimaryKey('news-cate_pk', 'news-cate', ['news-id', 'cate-id']); 

birden çok sütun için, dizi addPrimaryKey() yöntemde izin verilir.

Bu, raw sql yazmaktan daha iyidir.

+1

Ayrıca, tamsayı olmayan türde birincil anahtarlar oluşturmanın en iyi yoludur. –

+1

Çözüm için teşekkürler! –

7

yeni şema oluşturucu kullanabilirsiniz yii sürümü 2.06 itibariyle bu şekilde

public function safeUp() 
{ 
    $this->createTable('news-cate', [ 
     'news-id' =>'int NOT NULL', 
     'cate-id' =>'int NOT NULL', 
     'PRIMARY KEY (news-id,cate-id)' 
     ]); 
    $this->addForeignKey("fk_news_cate_nid", "news-cate", "news-id", "news", "id", "RESTRICT", "CASCADE"); 
    $this->addForeignKey("fk_news_cate_cid", "news-cate", "cate-id", "category", "id", "RESTRICT", "CASCADE"); 
} 
0

İdeal olarak iki tablo için birleşim oluşturuyorsunuz. Sadece bir astar koduna göre göç oluşturmak için Yii komut satırını kullanabilirsiniz: Öyle olacak

php yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:bigInteger" 

oluşturur:

/** 
* Handles the creation for table `post_tag`. 
* Has foreign keys to the tables: 
* 
* - `post` 
* - `tag` 
*/ 
class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migration 
{ 
    /** 
    * @inheritdoc 
    */ 
    public function up() 
    { 
     $this->createTable('post_tag', [ 
      'post_id' => $this->integer(), 
      'tag_id' => $this->integer(), 
      'created_at' => $this->dateTime(), 
      'PRIMARY KEY(post_id, tag_id)', 
     ]); 

     // creates index for column `post_id` 
     $this->createIndex(
      'idx-post_tag-post_id', 
      'post_tag', 
      'post_id' 
     ); 

     // add foreign key for table `post` 
     $this->addForeignKey(
      'fk-post_tag-post_id', 
      'post_tag', 
      'post_id', 
      'post', 
      'id', 
      'CASCADE' 
     ); 

     // creates index for column `tag_id` 
     $this->createIndex(
      'idx-post_tag-tag_id', 
      'post_tag', 
      'tag_id' 
     ); 

     // add foreign key for table `tag` 
     $this->addForeignKey(
      'fk-post_tag-tag_id', 
      'post_tag', 
      'tag_id', 
      'tag', 
      'id', 
      'CASCADE' 
     ); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function down() 
    { 
     // drops foreign key for table `post` 
     $this->dropForeignKey(
      'fk-post_tag-post_id', 
      'post_tag' 
     ); 

     // drops index for column `post_id` 
     $this->dropIndex(
      'idx-post_tag-post_id', 
      'post_tag' 
     ); 

     // drops foreign key for table `tag` 
     $this->dropForeignKey(
      'fk-post_tag-tag_id', 
      'post_tag' 
     ); 

     // drops index for column `tag_id` 
     $this->dropIndex(
      'idx-post_tag-tag_id', 
      'post_tag' 
     ); 

     $this->dropTable('post_tag'); 
    } 
} 

Ve Tablo yapısı böyle olacaktır:

+------------+------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+------------+------------+------+-----+---------+-------+ 
| post_id | int(11) | NO | PRI | NULL |  | 
| tag_id  | int(11) | NO | PRI | NULL |  | 
| created_at | bigint(20) | YES |  | NULL |  | 
+------------+------------+------+-----+---------+-------+ 

kontrol edin referans için aşağıda belirtilen URL:

http://www.yiiframework.com/doc-2.0/guide-db-migrations.html

İlgili konular