【问题标题】:Cannot truncate a table referenced in a foreign key constraint in Codeigniter无法截断 Codeigniter 中外键约束中引用的表
【发布时间】:2018-05-17 03:56:42
【问题描述】:

我正在使用 CodeIgniter 制作数据库播种器

这里是代码

class AreasSeeder extends Seeder {

private $table = 'areas';

public function run() {
    $this->db->truncate($this->table);

    $data = [
        [
            'name' => 'area1'
        ],
        [
            'name' => 'area2'
        ]
    ];

    $this->db->insert_batch($this->table, $data);

    echo PHP_EOL;
    }
}

当它运行时显示错误

Error Number: 1701
    Cannot truncate a table referenced in a foreign key constraint (`myproject`.`area_pref_relations`, CONSTRAINT `area_pref_relations_ibfk_1` FOREIGN KEY (`area_id`) REFERENCES `myproject`.`areas` (`id`))
    TRUNCATE `areas`
    Filename: database/seeds/areaSeeder.php
    Line Number: 8

我需要重置所有与表格区域相关的表格吗?

【问题讨论】:

    标签: mysql codeigniter


    【解决方案1】:

    这并不特定于 CodeIgniter。

    这是 MySQL 的限制。请改用DELETE 语句(假设没有外键行引用我们要从中删除行的表中的行,或者定义了外键约束@​​987654322@ 或ON DELETE SET NULL

    DELETE FROM `areas`;
    

    如果我们想使用TRUNCATE,我们需要禁用外键约束。要么删除引用表的键约束,然后对表执行TRUNCATE 并重新创建外键约束。

    ALTER TABLE `myproject`.`area_pref_relations` 
      DROP FOREIGN KEY `area_pref_relations_ibfk_1` ; 
    
    TRUNCATE TABLE `areas` ;
    
    ALTER TABLE `myproject`.`area_pref_relations` 
      ADD CONSTRAINT `area_pref_relations_ibfk_1`
      FOREIGN KEY (`area_id`) REFERENCES `myproject`.`areas` (`id`))
      ON UPDATE CASCADE ON DELETE CASCADE ; 
    

    或者,如果我们知道没有外键行引用我们正在截断的表中的行,则可以禁用会话的外键检查,执行 TRUNCATE,然后重新启用外键键。

     SET foreign_key_checks = 0 ;
     TRUNCATE TABLE my_referenced_table; 
     SET foreign_key_checks = 1 ;
    

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 2017-03-24
      • 2019-11-04
      • 2015-09-20
      • 2011-07-24
      • 2016-07-28
      • 2012-12-19
      相关资源
      最近更新 更多