SQL> truncate table dwr_item_div;表中的唯一/主键被启用的外键引用

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
SQL> truncate table dwr_item_div;
truncate table dwr_item_div

*
第 1 行出现错误:
ORA-02266: 表中的唯一/主键被启用的外键引用

oem管理不能禁用主键 外健
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
你想说什么么?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
抱歉,没有说清楚。
我需要把dwr_item_div清空,但她有 表中的唯一/主键被启用的外键引用
SQL> truncate table dwr_item_div;
truncate table dwr_item_div
*
第 1 行出现错误:
ORA-02266: 表中的唯一/主键被启用的外键引用

问如何才能清空该表
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
用了级联删除了吧??
把这个约束DISABLE掉。不过做之前确认下,是否可以这样做
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
“第三条慢是因为会去tabAA,tabAB上去检查基于此主键的外键是否存在
你禁用外键是一种解决方法,也可建立外键时不要设参数on delete cascade“

她的主健被另外一个表作为外健。所以不能禁用 (几个表互相关联我不愿意改变太多的表)
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
禁掉tabAA,tabAB中的外键,tabA中就能删掉

似乎不应该有这样的问题~
Top
4 楼hippie1024(努力必有痕迹)回复于 2004-12-21 16:54:43 得分 0 to daydayupliq(强强)
它消耗的时间是在tabAA,tabAB上寻找 ZtCode='001'的check时间,
即使已经删除了check时间还是存在的(就是确认是否已经删除的过程)
Top
5 楼daydayupliq(敞开胸怀!)回复于 2004-12-21 17:01:46 得分 0 不好意思,我比较糊涂~
Top
6 楼daydayupliq(敞开胸怀!)回复于 2004-12-21 17:06:02 得分 0 建议你建立外键时设参数on delete cascade
这样你删除tabA后会级联删除tabAA,tabAB的数据


这样会更快点么??? 发现一个tabA的主键,然后就删除它?
另外普通外键还有什么建法呢?学习!!

楼主的这个问题会不会是这个错误呢?
ERROR at line 1:
ORA-02266: 表中的唯一/主键被启用的外部关键字引用
Top
7 楼daydayupliq(敞开胸怀!)回复于 2004-12-21 17:20:18 得分 0 楼主不好意思,呵呵,我对外键这个概念的确比较糊涂~
1、如果建立普通外键,那么删除父表,对子表应该没有什么影响;
2、on delete cascade,应该会级联删除子表中的记录;
3、我用on delete cascade时,遇到了可以delte 但不能truncate的错误:
SQL> insert into b select * from dept;

4 rows created.

SQL> insert into a select * from emp;

14 rows created.

SQL> commit;

Commit complete.

SQL> alter table a add constraint pk_a primary key (empno);

Table altered.
SQL> alter table b add constraint pk_b primary key (deptno);

Table altered.
SQL> alter table a add constraint fk_a foreign key (deptno) references dept(d
ptno) (on delete cascade);

Table altered.

SQL> delete from b where deptno=10;

1 row deleted.

SQL> truncat table b;
SP2-0734: unknown command beginning "truncat ta..." - rest of line ignored.
SQL> truncate table b;
truncate table b

*
ERROR at line 1:
ORA-02266: 表中的唯一/主键被启用的外部关键字引用


Top
8 楼commit(滩涂鱼)回复于 2004-12-21 17:31:54 得分 0 谢谢二位参与的讨论,我刚才找到了教我们学习oracle开发的刘老师,教了我一个方法,解决了这个困扰我的问题,就是在两个子表中,建立与外键相应的索引,normal的就行,然后再删除,居然效率提高了n多倍,真是惊诧!!汉!
Top
9 楼hippie1024(努力必有痕迹)回复于 2004-12-21 20:31:08 得分 0 todaydayupliq
普通外键,从表有主表相关记录,主表记录是无法删除的
删除父表,会用主表的主键去查询从表的外键
truncate 对普通外键也是一样的,因为它是ddl不是DML

to commit
ft,你外键上没有建索引?
你建立外键后,删除父表,用主表的主键去查询从表的外键时就是一个索引JOIN索引快多了。

偶觉得,外键者,鸡肋也  :)
Top
10 楼daydayupliq(敞开胸怀!)回复于 2004-12-22 09:17:47 得分 0 外键一般是要建立索引的~

普通外键,从表有主表相关记录,主表记录是无法删除的
普通外键是不是不加(on delte **),这个没有实验出
http://topic.csdn.net/t/20041221/15/3663919.html
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
truncate vs delete with constraints on tables
发表人:www.wwf.co | 发表时间: 2006年六月21日, 13:47
这个问题,很久之前就已经注意到,并且感到很疑惑,但是没有深入思考,今天,终于看到了tom对此问题的解答

create">wwf@10GR2>create table t1(a number primary key);
表已创建。
create">wwf@10GR2>create table t2(col number, a number references t1);
表已创建。
insert">wwf@10GR2>insert into t1 values(1);
已创建 1 行。
insert">wwf@10GR2>insert into t2 values(1, 1);
已创建 1 行。
commit">wwf@10GR2>commit;
提交完成。
truncate">wwf@10GR2>truncate table t2;
表被截断。
truncate">wwf@10GR2>truncate table t1;
truncate table t1
*
第 1 行出现错误:
ORA-02266: 表中的唯一/主键被启用的外键引用
delete">wwf@10GR2>delete from t1;
已删除 1 行。
为什么子表已经没有记录,而truncate主表,出现ORA-02266错误,但是delete就不出错了呢?
很长时间以来,我就在实际工作中发现了这个现象,今天,终于在asktom上看到了tom的解释:
because truncate isn't going to verify the constraint, truncate is ddl.
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
以后小心使用truncate
白白花了大量时间在这个语句上。
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
终于解决这个问题
可以不用drop约束的情况 清空整个表
先delete从表再delete main table
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
truncate table的问题!
代码:--------------------------------------------------------------------------------
eba08是父表,eba09是子表
SQL> truncate table eba09 reuse storage;
Table truncated
SQL> truncate table eba08 reuse storage;
truncate table eba08 reuse storage
ORA-02266: 表中的唯一/主键被启用的外部关键字引用
SQL> select * from eba09;
EBA038
EBA002
EBA045
EBA046
EBA047
EBA048
EBA049
EBA050
EBA051
EBA052
EBA053
EBA054
EBA055
EBA056 AZY006
-------------------------------------------------- ---------- ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ ------------------ --------------------------------------------------------------------------------
SQL> truncate table eba08 ;
truncate table eba08
ORA-02266: 表中的唯一/主键被启用的外部关键字引用
SQL> delete from eba08;
17 rows deleted
SQL> commit;
Commit complete
SQL> 这样的为何不能使用truncate呢--------------------------------------------------------------------------------

__________________
一天进步一点点


楼主07-07-19 09:23 [ 大 中 小 ]


andytianyi
中级会员
注册日期: 2007 Mar
来自:
技术贴数:121
精华贴数:0
论坛积分:707
论坛排名:5111
论坛徽章:0




学习下。。。。。。。



2楼07-07-19 09:27 [ 大 中 小 ]


houyichong
蛇矛丈八枪 横挑马上将
注册日期: 2007 Mar
来自: 深圳
技术贴数:132
精华贴数:0
论坛积分:582
论坛排名:6110
论坛徽章:1



这种问题经常会碰到,我要顶一下



3楼07-07-19 09:30 [ 大 中 小 ]


喃喃
高级会员
注册日期: 2002 Sep
来自: 大连
技术贴数:878
精华贴数:0
论坛积分:3571
论坛排名:999
论坛徽章:3



被引用做外键的,只能delete
或者先把约束删除



4楼07-07-19 09:32 [ 大 中 小 ]


zhucs_2406
中级会员
注册日期: 2006 May
来自: 深圳
技术贴数:199
精华贴数:0
论坛积分:1700
论坛排名:2104
论坛徽章:0




有外键存在的情况下,不管是否有关联的数据,都不能使用TRUNCATE TABLE的。
你可以先删除外键,或者disable外键,然后TRUNCATE TABLE,之后再重建或者enable外键。
DELETE 的话,只要数据没有关联,都不会有影响的。TRUNCATE 和DELETE不一样。

__________________
既然选择了远方就只顾风雨兼程!
++++++++++++++++
上帝要使谁灭亡,必使谁先疯狂!


5楼07-07-19 09:38 [ 大 中 小 ]


喃喃
高级会员
注册日期: 2002 Sep
来自: 大连
技术贴数:878
精华贴数:0
论坛积分:3571
论坛排名:999
论坛徽章:3




quote:
--------------------------------------------------------------------------------
最初由 zhucs_2406 发布
有外键存在的情况下,不管是否有关联的数据,都不能使用TRUNCATE TABLE的。
你可以先删除外键,或者disable外键,然后TRUNCATE TABLE,之后再重建或者enable外键。
DELETE 的话,只要数据没有关联,都不会有影响的。TRUNCATE 和DELETE不一样。
--------------------------------------------------------------------------------

baidu 是个不错的老师



6楼07-07-19 10:02 [ 大 中 小 ]


ilovemk
中级会员
注册日期: 2007 Jul
来自:
技术贴数:137
精华贴数:0
论坛积分:566
论坛排名:6259
论坛徽章:0




alter table table_name disable constraint constraint_name;
truncate table table_name;
alter table table_name enable conatraint constraint_name;

__________________
大学这四年里,我一直认为自己是个人才,可是我错了,我不是!我他妈的竟然是一个天才!!!


7楼07-07-19 10:19 [ 大 中 小 ]


junsansi
高级会员
注册日期: 2006 Jul
来自: 北京
技术贴数:839
精华贴数:0
论坛积分:4435
论坛排名:802
论坛徽章:11



truncate ddl语句,delete dml语句

__________________
[三思笔记]学习动态性能表
[三思笔记]一步一步学rman
正努力将自己的脑袋改造成超大海绵,绝不放过一丝ora水汽
哇哈哈,哇哈哈哈哈~~
http://www.5ienet.com
===================
扫地不过是我表面上的工作,我真正的身份其实是无名老僧------------------手里那根扫把~~~~


8楼07-07-19 10:40 [ 大 中 小 ]


菜青虫一
猪一样的女子
注册日期: 2007 Jun
来自: 猪窝
技术贴数:63
精华贴数:0
论坛积分:779
论坛排名:4632
论坛徽章:2




truncate时候是要check这个约束条件的

__________________
仰视
俯视
正视


9楼07-07-19 13:17 [ 大 中 小 ]


hanjs
高级会员
注册日期: 2006 Jul
来自: 沈阳
技术贴数:2020
精华贴数:0
论坛积分:7764
论坛排名:490
论坛徽章:16



quote:
--------------------------------------------------------------------------------
最初由 ilovemk 发布
alter table table_name disable constraint constraint_name;
truncate table table_name;
alter table table_name enable conatraint constraint_name;
--------------------------------------------------------------------------------

这样太麻烦了,看来oracle应该改下,呵呵!

truncate 是ddl,不写log,自动commit
优点就是速度快,回收表空间,降低hwl
如果需要check外键的话,必然会影响速度,
对于数据量大的表,节省的时间会比写那几句话的时间要多的多,
所以,oralce这样做是没问题的



11楼07-07-19 17:06 [ 大 中 小 ]


hanjs
高级会员
注册日期: 2006 Jul
来自: 沈阳
技术贴数:2016
精华贴数:0
论坛积分:7728
论坛排名:490
论坛徽章:16



quote:
--------------------------------------------------------------------------------
最初由 喃喃 发布

truncate 是ddl,不写log,自动commit
优点就是速度快,回收表空间,降低hwl
如果需要check外键的话,必然会影响速度,
对于数据量大的表,节省的时间会比写那几句话的时间要多的多,
所以,oralce这样做是没问题的
--------------------------------------------------------------------------------

我只是随便说说都让你逮到了
降低hwm需要增加reuse storage!你可真是oracle迷哦

__________________
一天进步一点点


12楼07-07-19 18:31 [ 大 中 小 ]


dinner1007
高级会员
注册日期: 2005 May
来自:
技术贴数:2241
精华贴数:1
论坛积分:30816
论坛排名:150
论坛徽章:4



呵呵,学习下

__________________
一念成魔,一念成佛
欢迎来我的BLOG
大家都叫我晚饭吧


13楼07-07-19 20:25 [ 大 中 小 ]


beiphiju
一般会员
注册日期: 2005 Sep
来自:
技术贴数:79
精华贴数:0
论坛积分:600
论坛排名:5893
论坛徽章:0





quote:
--------------------------------------------------------------------------------
最初由 zhucs_2406 发布
有外键存在的情况下,不管是否有关联的数据,都不能使用TRUNCATE TABLE的。
你可以先删除外键,或者disable外键,然后TRUNCATE TABLE,之后再重建或者enable外键。
DELETE 的话,只要数据没有关联,都不会有影响的。TRUNCATE 和DELETE不一样。
--------------------------------------------------------------------------------
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行