Unverified Commit f0e93fb8 authored by Sergei Morozov's avatar Sergei Morozov Committed by GitHub

Merge pull request #3311 from arnegroskurth/alter-pk-with-ai

Fix: Ensuring correct ALTER TABLE statement for creation of an AUTO INCREMENT column as new PRIMARY KEY
parents 4b4d44f9 64790d4d
...@@ -612,6 +612,17 @@ SQL ...@@ -612,6 +612,17 @@ SQL
$keyColumns = array_unique(array_values($diff->addedIndexes['primary']->getColumns())); $keyColumns = array_unique(array_values($diff->addedIndexes['primary']->getColumns()));
$queryParts[] = 'ADD PRIMARY KEY (' . implode(', ', $keyColumns) . ')'; $queryParts[] = 'ADD PRIMARY KEY (' . implode(', ', $keyColumns) . ')';
unset($diff->addedIndexes['primary']); unset($diff->addedIndexes['primary']);
} elseif (isset($diff->changedIndexes['primary'])) {
// Necessary in case the new primary key includes a new auto_increment column
foreach ($diff->changedIndexes['primary']->getColumns() as $columnName) {
if (isset($diff->addedColumns[$columnName]) && $diff->addedColumns[$columnName]->getAutoincrement()) {
$keyColumns = array_unique(array_values($diff->changedIndexes['primary']->getColumns()));
$queryParts[] = 'DROP PRIMARY KEY';
$queryParts[] = 'ADD PRIMARY KEY (' . implode(', ', $keyColumns) . ')';
unset($diff->changedIndexes['primary']);
break;
}
}
} }
$sql = []; $sql = [];
......
<?php
namespace Doctrine\Tests\DBAL\Functional\Platform;
use Doctrine\DBAL\Schema\Comparator;
use Doctrine\Tests\DbalFunctionalTestCase;
use function in_array;
final class NewPrimaryKeyWithNewAutoIncrementColumnTest extends DbalFunctionalTestCase
{
/**
* {@inheritDoc}
*/
protected function setUp()
{
parent::setUp();
if (in_array($this->getPlatform()->getName(), ['mysql'])) {
return;
}
$this->markTestSkipped('Restricted to MySQL.');
}
/**
* Ensures that the primary key is created within the same "alter table" statement that an auto-increment column
* is added to the table as part of the new primary key.
*
* Before the fix for this problem this resulted in a database error: (at least on mysql)
* 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
*/
public function testAlterPrimaryKeyToAutoIncrementColumn()
{
$schemaManager = $this->connection->getSchemaManager();
$schema = $schemaManager->createSchema();
$table = $schema->createTable('dbal2807');
$table->addColumn('initial_id', 'integer');
$table->setPrimaryKey(['initial_id']);
$schemaManager->dropAndCreateTable($table);
$newSchema = clone $schema;
$newTable = $newSchema->getTable($table->getName());
$newTable->addColumn('new_id', 'integer', ['autoincrement' => true]);
$newTable->dropPrimaryKey();
$newTable->setPrimaryKey(['new_id']);
$diff = (new Comparator())->compare($schema, $newSchema);
foreach ($diff->toSql($this->getPlatform()) as $sql) {
$this->connection->exec($sql);
}
$validationSchema = $schemaManager->createSchema();
$validationTable = $validationSchema->getTable($table->getName());
$this->assertTrue($validationTable->hasColumn('new_id'));
$this->assertTrue($validationTable->getColumn('new_id')->getAutoincrement());
$this->assertTrue($validationTable->hasPrimaryKey());
$this->assertSame(['new_id'], $validationTable->getPrimaryKeyColumns());
}
private function getPlatform()
{
return $this->connection->getDatabasePlatform();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment