mysql mysql添加外键 如何截断外键约束表?




mysql添加外键 (7)

为什么我的群组上没有TRUNCATE ? 尽管我有ON DELETE CASCADE SET我得到:

错误1701(42000):无法截断在外键约束中引用的表( mytest ,CONSTRAINT instance_ibfk_1 FOREIGN KEY( GroupID )REFERENCES mygroupID ))

drop database mytest;
create database mytest;
use mytest;

CREATE TABLE mygroup (
   ID    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE instance (
   ID           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   GroupID      INT NOT NULL,
   DateTime     DATETIME DEFAULT NULL,

   FOREIGN KEY  (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
   UNIQUE(GroupID)
) ENGINE=InnoDB;

我只是简单地做到这一点:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;

虽然这个问题在5年前被问过了,但我不知道这个工具在MySql中存在,但现在如果你使用phpmyadmin,你可以简单地打开数据库,然后选择你想要截断的表。 底部有一个下拉列表,列出了很多选项。 打开它并在标题删除数据或表格下选择清空选项。 它会自动将您带到下一页,在复选框中有一个名为“启用外键检查”的选项。 只需取消选择它并按“是”按钮,选定的表格将被截断。 可能是它在内部运行user447951答案中建议的查询。 但使用phpmyadmin界面非常方便。


您无法对应用了FK约束的表进行TRUNCATETRUNCATEDELETE )。

要解决此问题,请使用这些解决方案之一。 两者都存在破坏数据完整性的风险。

选项1:

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除现在引用了无处的行
  4. 创建约束

选项2: user447951在他们的答案中建议

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;

获取旧的外键检查状态和sql模式是在将模型同步到数据库时,以Mysql Workbench的方式截断/删除表的最佳方式。

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET SQL_MODE[email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;

你可以做

DELETE FROM `mytable` WHERE `id` > 0

方案1所述,答案确实是由zerkms提供的答案

选项1 :不会损害数据完整性:

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除现在引用了无处的行
  4. 创建约束

棘手的部分是删除约束 ,所以我想告诉你,以防有人需要知道如何做到这一点:

  1. 运行SHOW CREATE TABLE <Table Name>查询以查看您的FOREIGN KEY的名称(下图中的红框):

  2. 运行ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> 。 这将删除外键约束。

  3. 删除关联的索引 (通过表结构页面),就完成了。

重新创建外键:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);

是的你可以:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

使用这些语句,您可能会冒险让行进入不符合FOREIGN KEY约束的表中。





dml