Mysql 如何使用原则截断表?

Mysql 如何使用原则截断表?,mysql,doctrine-orm,Mysql,Doctrine Orm,我想清空MySQL数据库中的一个表。如何使用条令做到这一点?使用条令截断表非常“简单”,如下所示: 但您必须知道,一旦MySQL有外键约束,它将无法截断任何表。您可以通过条令截断MySQL中的数据,以便它忽略外键约束 $connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;'); $truncateSql = $platform->getTruncateTableSQL('table_name'); $connection->

我想清空MySQL数据库中的一个表。如何使用条令做到这一点?

使用条令截断表非常“简单”,如下所示:


但您必须知道,一旦MySQL有外键约束,它将无法截断任何表。

您可以通过条令截断MySQL中的数据,以便它忽略外键约束

$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 0;');
$truncateSql = $platform->getTruncateTableSQL('table_name');
$connection->executeUpdate($truncateSql);
$connection->executeQuery('SET FOREIGN_KEY_CHECKS = 1;');
短变体(在迁移中最有用)


我将之前的答案概括为我在项目中使用过的一个很好的函数,请随意分享

/** 
 * @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;');
 }

如果要删除实体(包括最终由外键连接的关联实体),可以使用简单的DQL批处理查询,而不是截断:

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

只有在正确配置级联操作和删除操作(例如:


对于MySQL TRUNCATE命令,这不是一个直接的答案,但由于它与条令相关,因此这种方法可以解决您的问题。

如果您对我使用的外键有问题:

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

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

这个问题与原则2有关,而不是原则1
executeUpdate()
现在被弃用。这个答案可以更新吗?@Alec您确定该方法已弃用吗?在方法中没有任何已弃用的
。无法识别的配置参数“foreign\u key\u checks”是否在PostgreSQL上?
$q = $em->createQuery('delete from AppBundle\Entity\Customer');
$numDeleted = $q->execute();
class Customer
{
    /**
     * @ORM\OneToOne(targetEntity="Address", cascade={"all"}, orphanRemoval=true)
     */
    public $address;
}
$connection = $this->em->getConnection();
$connection->beginTransaction();

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