Como alternativa, puede simular el truncamiento con una combinación de eliminar todos los registros y luego volver a establecer el contador de incremento automático.
En primer lugar, debería crear una nueva clase de operación de base de datos que controlará el restablecimiento del valor de autoincremento de la tabla.
/**
* Resets all AUTO_INCREMENT counters on all tables in a dataset.
* @see PHPUnit_Extensions_Database_Operation_IDatabaseOperation
*/
class ResetAutoincrementOperation implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
{
/*
* @see PHPUnit_Extensions_Database_Operation_IDatabaseOperation::execute()
*/
public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection,
PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
{
foreach ($dataSet->getReverseIterator() as $table) {
$query = "ALTER TABLE {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}"
. " AUTO_INCREMENT = 1
";
try {
$connection->getConnection()->query($query);
} catch (PDOException $e) {
throw new PHPUnit_Extensions_Database_Operation_Exception('RESET_AUTOINCREMENT',
$query, array(), $table, $e->getMessage());
}
}
}
}
ahora sobrescribir los métodos getSetUpOperation()
y getTearDownOperation()
como se describe anteriormente.
class FooTest extends PHPUnit_Extensions_Database_TestCase
{
/**
* @see PHPUnit_Extensions_Database_TestCase::getTearDownOperation()
*/
protected function getTearDownOperation()
{
// Clean up after ourselves
return new PHPUnit_Extensions_Database_Operation_Composite(array(
PHPUnit_Extensions_Database_Operation_Factory::DELETE_ALL(), // 1. delete all records from table
new ResetAutoincrementOperation() // 2. reset auto increment value
));
}
/**
* @see PHPUnit_Extensions_Database_TestCase::getSetUpOperation()
*/
protected function getSetUpOperation()
{
return new PHPUnit_Extensions_Database_Operation_Composite(array(
PHPUnit_Extensions_Database_Operation_Factory::DELETE_ALL(), // 1. delete all records from table
new ResetAutoincrementOperation(), // 2. reset auto increment value
PHPUnit_Extensions_Database_Operation_Factory::INSERT() // 3. insert new records
));
}
}
a mí me funcionó con MySQL 5.5.24 y 3.6.10 PHPUnit
Esto sucede incluso cuando el cuadro de correspondencia entre la tabla que está truncando está vacía. Bastante seguro de que este es un error de MySQL, independientemente de los comentarios aquí: http://bugs.mysql.com/bug.php?id=54678 La solución @Tower es tristemente la única opción. – jmc