问题描述
嗨,汤姆,
我有两个表,包含我的主键x的表A和引用表B的属性y的表B,但是直到现在我还没有添加约束。
因此,
A -> x
B ->y
和y参考x。
我现在需要在表B上添加一个约束y referencing x
ALTER表 'B' 添加约束fk_B_A外键 ('y') 引用A('x');
我无法添加此约束,因为表A有一些记录,其中y列保存值0,因为它具有默认约束为NULL,但其整数类型。由于此值0不存在于列x中,因此不允许我应用该约束。
我怎么能找到解决这个问题的工作,因为我需要我的表B中有y值为0的记录,如果它保存为NULL,它会工作得很好,我手动更新了记录以设置y = NULL,并添加了约束。
但是对于我未来的记录,如果我创建一个记录,期望在表B中更新y的默认值 (这将保存为0),它将检查它与表a中的x并没有找到它,并且不允许我们创建记录。
这是正确的吗?
非常感谢您可以让我知道我们如何解决此问题。
非常感谢您的时间,
菲奥娜
我有两个表,包含我的主键x的表A和引用表B的属性y的表B,但是直到现在我还没有添加约束。
因此,
A -> x
B ->y
和y参考x。
我现在需要在表B上添加一个约束y referencing x
ALTER表 'B' 添加约束fk_B_A外键 ('y') 引用A('x');
我无法添加此约束,因为表A有一些记录,其中y列保存值0,因为它具有默认约束为NULL,但其整数类型。由于此值0不存在于列x中,因此不允许我应用该约束。
我怎么能找到解决这个问题的工作,因为我需要我的表B中有y值为0的记录,如果它保存为NULL,它会工作得很好,我手动更新了记录以设置y = NULL,并添加了约束。
但是对于我未来的记录,如果我创建一个记录,期望在表B中更新y的默认值 (这将保存为0),它将检查它与表a中的x并没有找到它,并且不允许我们创建记录。
这是正确的吗?
非常感谢您可以让我知道我们如何解决此问题。
非常感谢您的时间,
菲奥娜
专家解答
这里有几个选项,你可以看看
1) 添加触发器以将零转置为null
2) 添加一个虚拟列,以便维护您的零,但仍可以尽可能地执行完整性约束
1) 添加触发器以将零转置为null
2) 添加一个虚拟列,以便维护您的零,但仍可以尽可能地执行完整性约束
SQL> create table a ( x int primary key ); Table created. SQL> create table b ( z int, y int default 0 references a(x)); Table created. SQL> SQL> insert into a values (1); 1 row created. SQL> insert into b ( z ) values ( 123 ); insert into b ( z ) values ( 123 ) * ERROR at line 1: ORA-02291: integrity constraint (MCDONAC.SYS_C0013120) violated - parent key not found SQL> SQL> -- SQL> -- Option 1 SQL> -- SQL> create or replace 2 trigger mangle_b 3 before insert or update on b 4 for each row 5 begin 6 :new.y := case when :new.y != 0 then :new.y end; 7 end; 8 / Trigger created. SQL> SQL> insert into b ( z ) values ( 123 ); 1 row created. SQL> select * from b; Z Y ---------- ---------- 123 1 row selected. SQL> SQL> -- SQL> -- Option 2 SQL> -- SQL> SQL> drop table b purge; Table dropped. SQL> create table b ( z int, y int default 0); Table created. SQL> SQL> alter table b add custom_y int generated always as ( case when y != 0 then y end ); Table altered. SQL> SQL> alter table b add constraint custom_y_fk 2 foreign key ( custom_y) references a(x); Table altered. SQL> SQL> insert into b ( z ) values ( 123 ); 1 row created. SQL> select * from b; Z Y CUSTOM_Y ---------- ---------- ---------- 123 0 1 row selected. SQL> SQL> insert into b ( z,y ) values (1,1 ); 1 row created. SQL> select * from b; Z Y CUSTOM_Y ---------- ---------- ---------- 123 0 1 1 1 2 rows selected. SQL> SQL> insert into b ( z,y ) values (1,2 ); insert into b ( z,y ) values (1,2 ) * ERROR at line 1: ORA-02291: integrity constraint (MCDONAC.CUSTOM_Y_FK) violated - parent key not found SQL>复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1444次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
878次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
538次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
492次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
424次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
364次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
310次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
278次阅读
2025-04-08 09:12:48
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
266次阅读
2025-03-24 09:42:53
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
264次阅读
2025-03-19 14:41:51