给已有数据的oracle表建立外键关系

PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找;

  客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录;但客户要的急,就执行了错误的操作,删除了外键约束,在执行的删除,但在通过alter语句进行添加外键的时候,报错未找到父项关键字;

网上搜索了下,说未找到父项关键字的原因是2张表的数据不统一,后通过minus关键字查询2张表的差值,确实存在;

在google之后发现了2种方法可以解决:

  1、删除多余的数据,保持2张表数据统一,在执行 alter table 表1 add constraint FK_XXX foreign key(字段1)  references 表2 (字段2);就不会报错了;

(ps:这种方式在实际生产过程中不实际,生产环境数据不能随便删除的,所以这种方式不现实,不推荐)

  2、在alter语句之后加上enable novalidate即可,即

alter table 表1 add constraint FK_XXX foreign key(字段1)  references 表2 (字段2) enable novalidate;

(ps:enable novalidate指的是允许已有记录不满足约束条件,但新增/修改的记录则必须满足约束条件)

这是其他3种的含义:

  Enable Validate与Enable相同,检查已有记录和新增记录,确保都符合约束;

  Disable Validate禁用约束,删除约束上的索引,不允许修改任何被约束的记录;

  Disable Novalidate与Disable相同,禁用约束,删除约束上的索引,且允许修改被约束的记录。
---------------------
关于oracle约束关键字Enable/Disable/Validate/Novalidate的详情,可以查看这篇原文,传送门
原文:https://blog.csdn.net/huang_xw/article/details/6396846

原文地址:https://www.cnblogs.com/zxg0822/p/10382746.html

时间: 2024-10-10 08:48:37

给已有数据的oracle表建立外键关系的相关文章

SQL Server数据库中导入导出数据及结构时主外键关系的处理

2015-01-26 软件开发中,经常涉及到不同数据库(包括不同产品的不同版本)之间的数据结构与数据的导入导出.处理过程中会遇到很多问题,尤为突出重要的一个问题就是主从表之间,从表有外检约束,从而导致部分数据无法导入. 情景一.同一数据库产品,相同版本 此种情况下源数据库与目标数据库的数据结构与数据的导入导出非常简单. 方法1:备份源数据库,恢复到目标数据库即完成. 方法2:使用SQL Sever数据库自带的[复制数据库]功能或者[导入数据]功能按照向导操作即可. 情景二.同一数据库产品,不同版

oracle sql查询表外键关系

SELECT F.TABLE_NAME, F.CONSTRAINT_NAME, F.COLUMN_NAME, F.POSITION, P.TABLE_NAME, P.COLUMN_NAME, P.POSITION ,R.OWNER FROM USER_CONSTRAINTS R, USER_CONS_COLUMNS F, USER_CONS_COLUMNS P WHERE 1=1 and R.OWNER = UPPER('ATS001') AND R.TABLE_NAME = UPPER('AC

父表、子表 主外键关系

ORACLE官方文档介绍: Concurrency Control, Indexes, and Foreign Keys You almost always index foreign keys. The only exception is when the matching unique or primary key is never updated or deleted.(你总是需要对 外键添加索引! 唯一的例外就是:匹配的主键列 或是 唯一列 从不进行更新操作或者 删除操作) Oracle

day5_查看表主外键关系

[外键--通过子表查询] SELECT '父表:'||USER_INDEXES.TABLE_NAME||'  '||'父表列:'||USER_IND_COLUMNS.COLUMN_NAME||'   '||'子表:'||USER_CONS_COLUMNS.TABLE_NAME||'   '||'子表列:'||USER_CONS_COLUMNS.COLUMN_NAME FROM USER_CONSTRAINTS,USER_CONS_COLUMNS,USER_INDEXES,USER_IND_COL

SQL Server中建立外键的方法

在SQL中建立外键约束,可以级联查询表中的数据,在C#代码生成器中,也能根据外键关系生成相应的外键表数据模型.外键也可防止删除有外键关系的记录,一定程度上保护了数据的安全性. 步骤: 1.要建立外键关系,首先要保证用来建立外键关系的列具有唯一性,即具有 UNIQUE 约束通常是某表的主键作为另外一个表的外键 2.打开数据库表,找到要建立外键的表.并确保其中要建立外键关系的列与主键表中的数据类型完全一致 3.在要建立外键关系的表中,在任意列上右击,选择[关系] 4.在外键关系对话框中,点击左下角的

SQL_建立外键约束

--外键与和它相对应的主键可以属性名不同,但是数据类型和长度必须一致 --外键约束中约束表中德约束字段必须是主键或者候选键,即必须有唯一性 alter table students --指定修改的表 add constraint fk_ClassName -- 添加约束的名称 foreign key(ClassName) --指定students表建立外键的字段 references teachers (Greade) --指定外间约束表的名称以及字段 --在创建表是创建外键约束 --单字段说明

MySQL创建数据表并建立主外键关系

为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引,如果外键列不存在索引,mysql将自动创建索引. 一.SQL语句创建数据表并设置主外键关系 create table demo.ChineseCharInfo ( ID int not null auto_increment, Hanzi varchar(10) not null, primary

oracle主从表主外键对应关系

一.首先让我们来了解下什么是主外键? 1.主键:唯一标识数据表中的某一行 1) 一个表中只能有一个主键.如果在其他字段上建立主键,则原来的主键就会取消.在ACCESS中,虽然主键不是必需的,但最好为每个表都设置一个主键. 2)主键的值不可重复,也不可为空(NULL).主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义. 3)主键的创建:在建置新表格时设定主键的方式 MySQL:  CREATE TABLE Customer (SID integer,La

MyEclipse数据库教程:表、外键和索引的使用方法

MyEclipse数据库教程:表.外键和索引的使用方法 MyEclipse的数据库资源管理器工具提供了大量的向导和操作,来轻松地创建和删除表.关系和索引.在本教程中,你将学习到: 创建和删除表 创建和删除外键 创建和删除索引 没有MyEclipse?立即下载 1. 创建一个新的索引 创建索引是开发人员重要的性能工具,典型的就是在DBMS上创建一个表的索引键.然而可能在其他领域中经常需要使用ORDER BY或WHERE子句来增强性能.假设您可能在CITY中有很多订购的客户,您可以在该领域中创建索引