表有主外键约束时的delete 方法

本文详细介绍了在数据库操作中如何处理主键与外键的关系,包括创建表、插入数据、以及在存在外键约束的情况下如何正确地删除数据。通过实例演示了两种主要的删除方法:先删除外键表数据再删除主键表数据,以及禁用外键约束进行删除。


--主键表的创建
create table pk_table(id int   primary key,name varchar2(30))

insert into pk_table values(1,'computer');

insert into pk_table values(2,'music');

insert into pk_table values(3, 'sfsdfs');

insert into pk_table values(4,'aassssssssssssscczcxzxvcccaa');

commit;


select * from pk_table


--外键表的创建
create table fk_table(dept varchar2(45),sid int);


ALTER TABLE fk_table ADD CONSTRAINT fk_orders1 FOREIGN KEY (sid) REFERENCES pk_table(id);

insert into fk_table values('aaaa',1);

insert into fk_table values('bbbb',2);

insert into fk_table values('cccc',3);

insert into fk_table values('dddd',4);

 

commit;

   ---这时会报错   ORA-02292: integrity constraint (SYS.FK_ORDERS1) violated - child record found
delete from pk_table  where id=2;

 

--删除数据的方法有

--1.先删外键表的数据,再删除主表数据

delete from fk_table where sid=1;


--主键表
delete from pk_table where id=1;

commit;

--方法2:  把相关的外键约束disable

 ALTER TABLE fk_table disable CONSTRAINT fk_orders1;
 
 --约束disable后,删除表中需要删除的数据,注意有完敕性关连的数据必须全部删除,否则后面的enable constraint 将报错,所以清理数据时关连的要全部清理.
delete from fk_table where sid=2;

--主键表
delete from pk_table where id=2;
 
 commit;
 
 --将约束enable
 ALTER TABLE fk_table enable CONSTRAINT fk_orders1;
 
 
 
  --将约束enable, 加上novalidate 只检查以后进来的数据,对以存在的数据不作验证. 但你相关表数据删除没有完全清理时, 表的完敕性约束已破环.
 ALTER TABLE fk_table enable novalidate CONSTRAINT fk_orders1;
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10834762/viewspace-438811/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10834762/viewspace-438811/

内添加外键约束有以下几种情况: ### 创建添加外键约束 创建添加外键约束的语法示例如下: ```sql create table table_name( id int primary key auto_increment, # 设为主键且自动增长 name not null unique, # 不为空且值唯一 sex default '男', # 使用默认约束,默认性别为男 constraint 索引名 foreign key(外键列) references 主键(主键列) on delete cascade | on delete set null 外键约束 ); ``` 其中,`constraint` 用于指定索引名,`foreign key(外键列)` 指定外键列,`references 主键(主键列)` 指明引用的主键和主键列,`on delete` 后面可跟不同的操作,如 `cascade`(删除包含与已删除键值有参照关系的所有记录)、`set null`(修改包含与已删除键值有参照关系的所有记录,使用 `NULL` 值替换,但不能用于已标记为 `NOT NULL` 的字段)等 [^3][^5]。 ### 为已存在的添加外键约束 为已存在的添加外键约束的语法格式如下: ```sql alter table 名 add constraint FK_ID foreign key(外键字段名) REFERENCES 主名(主键字段名); ``` 例如,若要为某个添加外键约束,可使用此语法,将相应的名、外键字段名、主名和主键字段名替换进去 [^1]。 ### 新建若原不存在的情况 如果要创建一个引用其他主键的新,且原可能不存在,可先删除可能存在的同名,再创建新并添加外键约束,示例如下: ```sql drop table audit; create table audit( emp_no int not null, create_date datetime not null, foreign key(emp_no) references employees_test(id) ); ``` 这里先删除 `audit` (若存在),然后创建新的 `audit` ,同指定 `emp_no` 为外键,引用 `employees_test` 的 `id` 字段 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值