首页 > 解决方案 > 我如何解决外键中的 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 行,我该怎么办?

标签: oracle

解决方案


“我怎样才能改变主键的值,并且基于这个pk的外键也会改变?”

首先,您永远不需要这样做。像这样的主键实际上只是标识一行的数字,它们本身没有任何意义。这就像问你将如何改变ROWID一行。

如果必须,您可以:

  1. 找到指向该表的外键并禁用它们ALTER CONSTRAINT myconstraint DISABLE
  2. 更新您的主表并使用 捕获新的 id 值UPDATE test1 SET id = mysequence.NEXTVAL WHERE id = :oldid RETURNING id INTO :newid,假设它是由序列设置的。
  3. 使用新 ID 更新其他表中的 ID。
  4. 重新启用您的约束。

请注意,更改约束是 DDL 并将执行隐式提交,这种方法将使您的表不受外键约束的保护。

第二种方法是:

  1. 在主表中插入新行并捕获新 id。
  2. 用新的 id 更新外表中的 id。
  3. 删除主表中的旧行。

现在我想起来,第二种方法对我来说似乎更好。没有 DDL,它看起来更干净。


推荐阅读