无法截断Codeigniter

时间:2018-05-17 03:56:42

标签: mysql codeigniter

我正在使用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

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

1 个答案:

答案 0 :(得分:0)

这不是CodeIgniter特有的。

这是MySQL的限制。请改用DELETE语句(假设没有外键行引用表中的行,我们要删除行,或者定义外键约束ON DELETE CASCADEON 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 ;