SQL truncate表时提示外键错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL truncate表时提示外键错误相关的知识,希望对你有一定的参考价值。

在SQL中truncate一个表时,提示
Cannot truncate table 'MRB_OrdersHeaders' because it is being referenced by a FOREIGN KEY constraint.
上网查原因,有方法说先disable外键然后再truncate
但我执行alter table MRB_OrdersHeaders nocheck CONSTRAINT all 后再,truncate
仍然提示上次错误,这是为什么呢?

nocheck选项只对插入、更新记录有用,对truncate没有用,而且你禁用MRB_OrdersHeaders的外键是没用的,不能truncate的主要原因是MRB_OrdersHeaders表被其它表的外键引用了。
如果业务允许,把引用了MRB_OrdersHeaders表的其它表的相应外键都删掉。
如果需要保留那些外键,则把相应表里存在的记录都删除就行了。
比如MRB_OrdersHeaders表被A表引用,那么就先删除A表中的记录。因为可能涉及级联引用的问题,需要一级级的删除。
删除之后也是不能truncate的,只能delete追问

我是需要truncate的,其实我把所有其它相关联的表数据都删除了,这个要truncate的表的数据也删除了,因为有个问题,就是有个字段是ID号,也就是说是自动取得的数需要重新记数,这样就需要truncate,但我又不想改动太多,类似把所有外键都删除,然后再建,感觉有些麻烦,还怕出错,看似只有这一种办法了,其实不truncate也行,也就是不重新记数,只是感觉不太好,不太专业,再个让用户用起来不太爽,呵呵

追答

问题解决没?如果你只想重置自增列,那很好办,不用删除外键引用。
在表中数据已经全部删除的情况下,执行
DBCC CHECKIDENT(MRB_OrdersHeaders ,RESEED,0)
这样,当插入新行的时候自增列值还是从1开始

追问

还没试呢,我的用户又给我加了条数据,郁闷...

参考技术A alter table MRB_OrdersHeaders nocheck CONSTRAINT all 用于表示现有数据不对约束进行验证,但约束仍然存在。
如果要删除表应找到相应约束,删除此约束,如
ALTER TABLE MRB_OrdersHeaders DROP CONSTRAINT [FK__MRB_OrdersHeader__1]追问

看来想要truncate是必须得删除外键了,有什么简便的方法,删除外键后再重新建外键,和原来一样的?

参考技术B 有外键的表不可以北truncate 可以delete 参考技术C sp_fkeys 'MRB_OrdersHeaders' 看看都哪些外键引用追问

看完之后呢,是不是需要删除外键? 然后再truncate,然后再把外键重新建一下?貌似有些麻烦

参考技术D 555

sql如何在创建表时设置外键

是在创建表的时候设置,不是修改时设置

1.直接写sql语句。

2.用SQLyog 选择外键表 ,点击右键 选择关联/外键,然后再选择主表,外键。

3.在表 vet_specialties 上点击右键 ,然后找到Relationships/ForeignKeys中,然后选择相应的列。

具体如下:

1、简介

SQL语言,是结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

2、应用信息

结构化查询语言SQL(STRUCTURED QUERY LANGUAGE)是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索,第四代软件开发工具中嵌入SQL的语言等。

3、支持标准

SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。

参考技术A 很简单:
比如stuInfo(学生信息表)表是主表。他的主键是stuID,
另外还有一个stuExam表(学生考试成绩表)。在这个表中也有个列是stuID,但是要引用主表中的stuID.
那么在创建约束的时候:
alter table stuExam
add constraint fk_stuID foreign key(stuID) references stuInfo(stuID)
go
就这3行就搞定。(实现了stuExam表的stuID引用了主表stuInfo的主键关系)你适当的修改下成为你自己的表名和列名
参考技术B create table 表名(
列名1 参数,
列名2 参数,
foreign key(列名) references 目标表名(目标列名)
);
参考技术C use Parkingmagage
create table car_fee
(
car_pay_id char(10) primary key,
st_car_num char(10),
foreign key (st_car_num) references st_car (st_car_num)//st_car表中的st_car_num作为正在创建的表car_fee的外键
);

参考技术D create table table_name
(
id int primary key,

)

以上是关于SQL truncate表时提示外键错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql中删除时报错Cannot truncate a table referenced in a foreign key constraint (`em_hgh`.`monitoritem`, C

sql如何在创建表时设置外键

为啥我在尝试创建此表时不断收到外键错误? [复制]

Oracle truncate表失败

MySQL truncate含有外键约束的条目报错

SQL中Truncate的用法