use*_*986 601 mysql truncate constraints foreign-keys dml
为什么没有一个TRUNCATE上mygroup
工作?即使ON DELETE CASCADE SET
我得到了:
错误1701(42000):无法截断外键约束中引用的表(
mytest
.instance
,CONSTRAINTinstance_ibfk_1
FOREIGN KEY(GroupID
)REFERENCESmytest
.mygroup
(ID
))
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;
Run Code Online (Sandbox Code Playgroud)
use*_*951 1265
是的你可以:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
使用这些语句,您可能会冒险将行放入不符合FOREIGN KEY
约束的表中.
zer*_*kms 911
您不能TRUNCATE
在其上应用FK约束的表(TRUNCATE
与其不同DELETE
).
要解决此问题,请使用以下任一解决方案.两者都存在损害数据完整性的风险.
选项1:
TRUNCATE
选项2:用户 447951在答案中建议
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
Geo*_*ili 156
我只想这样做:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)
小智 17
你可以做
DELETE FROM `mytable` WHERE `id` > 0
Run Code Online (Sandbox Code Playgroud)
Ome*_*bic 12
根据mysql文档,TRUNCATE不能用于具有外键关系的表.没有完整的替代AFAIK.
删除约束仍然不会调用ON DELETE和ON UPDATE.我能想到的唯一解决方案是:
在MySQL中似乎TRUNCATE还不是一个完整的功能(它也不会调用触发器).
见评论
Kam*_*esh 10
在 MYSQL 数据库上测试
解决方案1:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
Run Code Online (Sandbox Code Playgroud)
解决方案2:
DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;
Run Code Online (Sandbox Code Playgroud)
这对我有用。我希望,这也能帮助你。感谢您提出这个问题。
虽然这个问题是在5年前提出的,但我不知道当时MySql中存在这个功能,但现在如果你使用phpmyadmin,你只需打开数据库,然后选择你要截断的表.在底部有一个下拉列表,其中列出了许多选项.打开它并选择标题删除数据或表格下的清空选项.它会自动转到下一页,其中复选框中有一个选项,称为启用外键检查.只需取消选择它并按是按钮,所选表格将被截断.可以在内部运行user447951的答案中建议的查询.但是从phpmyadmin界面使用非常方便.
如果您使用的是phpMyAdmin,则很容易。
只需取消选中Enable foreign key checks
选项SQL
卡下的选项并运行TRUNCATE <TABLE_NAME>
选项1:不会冒损坏数据完整性的风险:
- 消除约束
- 执行截断
- 手动删除现在无处引用的行
- 创建约束
棘手的部分是删除约束,所以我想告诉您如何操作,以防有人需要知道如何做:
运行SHOW CREATE TABLE <Table Name>
查询以查看您的FOREIGN KEY的名称是什么(下图中的红色框):
运行ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
。这将删除外键约束。
删除关联的索引(通过表结构页面),就可以完成。
重新创建外键:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
456065 次 |
最近记录: |