我在Oracle数据库(19 c)中有以下表:
CREATE TABLE debtors (
bankruptID NUMBER NOT NULL,
category VARCHAR2(50) NOT NULL,
lastname VARCHAR2(100),
firstname VARCHAR2(80),
birthdate DATE,
birthplace VARCHAR2(100),
constraint DEBTORS_PK PRIMARY KEY (bankruptID));
ALTER TABLE debtors ADD CONSTRAINT debtors_fk0 FOREIGN KEY (category) REFERENCES categories(BankruptCategory);
它有一个主键和一个指向另一个表的外键。我想用sqlldr从一个csv文件导入数据到这个表(债务人)中。下面是 ctl 和 *par * 文件:
OPTIONS (SKIP=1)
LOAD DATA
CHARACTERSET CL8MSWIN1251
INTO TABLE myschema.debtors
REENABLE DISABLED_CONSTRAINTS EXCEPTIONS EXCEPT_TABLE
FIELDS TERMINATED BY '^'
TRAILING NULLCOLS
(
bankruptID,
category,
lastname,
firstname,
birthdate date 'YYYY-MM-DD HH24:MI:SS',
birthplace
)
userid=username/password@mydb
control=debtors.ctl
log=debtors.log
bad=debtors.bad
data=debtors.csv
direct=true
完成任务后,日志文件将显示以下内容:
参考完整性约束/触发信息:NULL、UNIQUE和PRIMARY KEY约束不受影响。
在加载之前,约束mychema.DEBTORS.DEBTORS_FK0已禁用且未验证。处理了表mychema.DEBTORS上的以下索引:index mychema.DEBTORS_PK成功加载,有896个键
表mychema.DEBTORS没有约束异常表。加载后未重新启用任何约束、REFERENTIAL约束。
并且外键(debtors_fk0)变为禁用。正如你在 *ctl * 文件中看到的,我有REENABLE子句,但它似乎不工作。你能帮我弄明白问题出在哪里吗?我想让它自动重新启用约束
我创建了一个EXCEPT_TABLE表来存储所有异常,但它没有帮助
1条答案
按热度按时间nmpmafwu1#
一切都在预料之中。如果你检查约束状态,你会看到它是ENABLED,但是NOT VALIDATED-如果有违反外键约束的行,它就不可能。
示例1:一切都好的时候会发生什么
示例表:
两个类别(22,33)-它们都将在加载数据时使用,这意味着不会违反外键约束:
控制文件:
加载会话:使用直接路径时,Oracle会自动禁用文档中所述的约束。
日志文件说:
测试结果:
示例2:缺少外键约束的父键。
示例表:
类别现在缺少ID_CAT = 33:
控制文件未修改-样本数据仍包含ID_CAT = 33行。
调用sqlldr的方式没有任何变化;两行(即使是无效行!)加载:
日志上写着(仔细阅读**!):
结果:
test
(目标)表中的两行。except_Table
现在包含违反外键约束的行。约束状态为启用未验证。如果你尝试手动验证外键约束,你将无法做到这一点:
首先删除违反约束的行,然后验证它:
因此,是的-一切都很好,并按预期工作。