oracle - 我如何解决外键中的 ORACLE 问题
问题描述
我在 oracle 中遇到问题,我需要帮助。我有以下查询:
1 CREATE TABLE TEST1 (
2 NAME VARCHAR(20)
3 ID VAR(9)
4 PRIMARY KEY(ID)
5 FOREIGN KEY(NAME) References TEST2(ANAME)
6 ON DELETE CASCADE ON UPDATE SET NULL );
如果我想删除第 6 行,我该怎么办?
解决方案
“我怎样才能改变主键的值,并且基于这个pk的外键也会改变?”
首先,您永远不需要这样做。像这样的主键实际上只是标识一行的数字,它们本身没有任何意义。这就像问你将如何改变ROWID
一行。
如果必须,您可以:
- 找到指向该表的外键并禁用它们
ALTER CONSTRAINT myconstraint DISABLE
- 更新您的主表并使用 捕获新的 id 值
UPDATE test1 SET id = mysequence.NEXTVAL WHERE id = :oldid RETURNING id INTO :newid
,假设它是由序列设置的。 - 使用新 ID 更新其他表中的 ID。
- 重新启用您的约束。
请注意,更改约束是 DDL 并将执行隐式提交,这种方法将使您的表不受外键约束的保护。
第二种方法是:
- 在主表中插入新行并捕获新 id。
- 用新的 id 更新外表中的 id。
- 删除主表中的旧行。
现在我想起来,第二种方法对我来说似乎更好。没有 DDL,它看起来更干净。
推荐阅读
- python - TensorFlow 不能很好地与 IPython 配合使用
- c# - Task.Run 和 await 可以在受约束的执行区域中使用吗?
- android - camera.action.CROP 没有按预期工作
- sonarqube - 尝试设置自定义 HTML 标记样式时,sonarqube 使用“应删除未知类型选择器”规则给出误报
- reactjs - 在反应应用程序中获取可共享的文档链接
- java - EhCache,堆上层:未找到序列化程序
- ionic-framework - 如何“打破”一个 Observable 并跳转到 Ionic 中的另一个页面?
- docker - 代理后的 Docker Hub 登录
- javascript - 我如何在画布 qml 元素中使用 FontLoader qml 对象?
- ios - dequeueReusableCellWithIdentifier 返回相同索引路径的不同单元格