2011-12-15 54 views

回答

21

截断与学说的表是“简单”为:

$connection = $entityManager->getConnection(); 
$platform = $connection->getDatabasePlatform(); 

$connection->executeUpdate($platform->getTruncateTableSQL('my_table', true /* whether to cascade */)); 

但是你要知道,MySQL将无法截断任何表,一旦它有一个外键约束。

+0

那么我们如何能够truncat – Acyra 2013-02-02 13:44:41

+0

在MySQL中,你不能在你有外键设置... – Herzult 2013-02-04 08:47:23

+1

`的executeUpdate ()`现在已被弃用。这个答案可以更新吗? – Alec 2015-11-12 12:01:24

12

您可以通过学说,使其忽略外键约束在MySQL截断数据...

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;'); 
$truncateSql = $platform->getTruncateTableSQL('table_name'); 
$connection->executeUpdate($truncateSql); 
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;'); 
0

短变异(最有用的迁移)!

Doctrine_Manager::getInstance()->getConnection('doctrine')->getDbh()->exec("TRUNCATE name"); 
4

我把这个答案推广到一个很好的函数,我已经在我的项目中使用它,随时分享。

/** 
* @param array $tableNames Name of the tables which will be truncated. 
* @param bool $cascade 
* @return void 
*/ 
public function truncateTables($tableNames = array(), $cascade = false) { 
    $connection = $this->em->getConnection(); 
    $platform = $connection->getDatabasePlatform(); 
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;'); 
    foreach ($tableNames as $name) { 
     $connection->executeUpdate($platform->getTruncateTableSQL($name,$cascade)); 
    } 
    $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;'); 
} 
0

如果要删除实体,包括相关的实体最终由外键连接,你可以使用一个简单的DQL批量查询,而不是截断的:

$q = $em->createQuery('delete from AppBundle\Entity\Customer'); 
$numDeleted = $q->execute(); 

http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html#dql-delete

这不仅会如果您正确配置级联操作并与关联协同工作,并且orphanRemoval例如:

class Customer 
{ 
    /** 
    * @ORM\OneToOne(targetEntity="Address", cascade={"all"}, orphanRemoval=true) 
    */ 
    public $address; 
} 

这不是关于MySQL TRUNCATE命令的直接答案,但是由于它是通过Doctrine实现的,因此可以解决您的问题。

2

如果你有外键的问题我一起工作:

$connection = $this->em->getConnection(); 
$connection->beginTransaction(); 

$connection->query('DELETE FROM reception_detail'); 
$connection->query('ALTER TABLE reception_detail AUTO_INCREMENT = 1');