1

この2つの移行ファイルがあり、 「クライアント」の主キーを「サンプル」に外部キーとして追加したいのですが、移行時に「外部キー制約の形式が正しくありません」というエラーが表示されます。

コマンドラインのスクリーンショットは次のとおりです。

エラーのスクリーンショット

これが私のコードです:

クライアントの作成

<?php
use Migrations\AbstractMigration;

class CreateClients extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('clients');

        $table->addColumn('name', 'string', [
            'limit' => 100,
            'null' => false,
        ]);
        $table->addColumn('title', 'string', [
            'default' => null,
            'limit' => 100,
            'null' => true,
        ]);
        $table->addColumn('street', 'string', [
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('city', 'string', [
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('state', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('zipcode', 'biginteger', [
            'limit' => 10,
            'null' => false,
        ]);
        $table->addColumn('country', 'string', [
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('phone', 'biginteger', [
            'limit' => 10,
            'null' => false,
        ]);
        $table->addColumn('emailprimary', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('emailsecondary', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('username', 'string', [
            'limit' => 255,
            'null' => false,

        ])->addIndex(array('username'), array('unique' => true));
        $table->addColumn('password', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('billing_title', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('billing_street', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('billing_city', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('billing_state', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('billing_zipcode', 'biginteger', [
            'default' => null,
            'limit' => 20,
            'null' => true,
        ]);
        $table->addColumn('billing_country', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->addColumn('billing_phone', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => true,
        ]);
        $table->create();
    }
}

サンプルの作成

<?php
use Migrations\AbstractMigration;

class CreateSamples extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('samples');

        $table->addColumn('name', 'string', [
            'limit' => '100',
            'null' => false,
        ]);
        $table->addColumn('client_id', 'integer', [
            'null' => false,
        ]);
        $table->addForeignKey('client_id', 'clients', 'id', array('delete'=> 'SET_NULL', 'update'=> 'NO_ACTION'));
        $table->save();

        $table->create();
    }
}
4

1 に答える 1

2

CreateSamples 移行で、client_id列を非 null として定義します。ただし、外部キーを定義するときは、 のようにしますon delete, set null。それは一緒に行くことはできません。アプリケーションのロジックによっては、 の代わりにSET_NULLCASCADEまたはより良い選択になります。RESTRICT(制限により、サンプルを含むクライアントを削除できなくなります。)client_id列を として定義することもできます'null' => 'true'。したがって、たとえば、これを試してください:

$table->addForeignKey('client_id', 'clients', 'id', array('delete'=> 'CASCADE', 'update'=> 'NO_ACTION'));

これにより、クライアントを削除するとサンプルが削除されます。

その MySQL の動作に関する詳細な説明はこちら.

于 2016-02-20T22:38:49.723 に答える