我的 Oracle 数据库 (19c) 中有下表:
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 上的以下索引已处理:索引 mychema.DEBTORS_PK 已成功加载 896 个键
表 mychema.DEBTORS 没有约束异常表。加载后没有重新启用 CHECK、REFERENTIAL 约束。
并且外键 (debtors_fk0) 被禁用。正如您在 *ctl *file 中看到的,我有 REENABLE 子句,但它似乎不起作用。您能帮我了解问题所在吗?我希望它自动重新启用约束
我创建了一个 EXCEPT_TABLE 表来存储所有异常,但这没有帮助
一切都如预期。如果检查约束状态,您会看到它已启用,但未验证- 如果存在违反外键约束的行,则不可能是启用状态。
示例 1:当一切正常时会发生什么?
示例表:
两个类别 (22, 33) - 它们都会在加载数据时使用,这意味着不会违反外键约束:
控制文件:
加载会话:使用直接路径,Oracle 自动禁用文档中所述的约束。
日志文件说:
结果:
示例#2:缺少外键约束的父键。
示例表:
类别现在缺少 ID_CAT = 33:
控制文件未修改 - 示例数据仍包含 ID_CAT = 33 行。
调用 sqlldr 的方式没有任何改变;两行(甚至无效的行!)均已加载:
日志是这样说的(仔细阅读!):
结果:(目标)表中的两行
test
。except_Table
现在包含违反外键约束的行。约束状态为 ENABLED NOT VALIDATED。如果您尝试手动验证外键约束,您将无法执行此操作:
首先删除违反约束的行,然后验证它:
因此,是的 - 一切正常并且按预期工作。