【问题标题】:How do I fix my tables so that they work?如何修复我的桌子以使其正常工作?
【发布时间】:2019-05-06 20:21:10
【问题描述】:

我已将所有数据输入到我的表中,但是当我在 SQL 中运行它时,我收到以下消息:

第 1 行的错误: ORA-02291: 违反完整性约束 (SYSTEM.SYS_C008579) - 父键不 找到了

create table B_C_MAP (
B_C_ID INTEGER PRIMARY KEY,
B_ID    integer references BUSINESS(B_ID),
C_ID    integer references CATEGORY(C_ID)
);

insert into BUSINESS values (201, 'Gainesville', 'Bonefish', 301, 'BF Management');
insert into BUSINESS values (202, 'Manassas', 'Target', 302, 'Target Management');
insert into BUSINESS values (203, 'Centreville', 'Trader Joes', 302, 'TJ Management');
insert into BUSINESS values (204, 'Gainesville,', 303, 'VA Tire and Auto', 'TA Management');
insert into BUSINESS values (205, 'Manassas', 'Okras', 301, 'Okras Management');
insert into BUSINESS values (206, 'Gainesville', 'Giant', 302, 'Giant Management');
insert into BUSINESS values (207, 'Centreville', 'Kemper Carpet', 303, 'KC Management');
insert into BUSINESS values (208, 'Manassas', 'Imperial Auto', 303, 'IA Management');
insert into BUSINESS values (209, 'Gainesville', 'Glory Days Grille', 301, 'GDG Management');
insert into BUSINESS values (210, 'Manassas', 'Cracker Barrel', 301, 'SW Management');

insert into CATEGORY values (301, 'Food');
insert into CATEGORY values (302, 'Retail');
insert into CATEGORY values (303, 'Service');

insert into B_C_MAP values (401, 301,201);
insert into B_C_MAP values (402, 301, 205);
insert into B_C_MAP values (403, 301,209);
insert into B_C_MAP values (404, 301,210);
insert into B_C_MAP values (405, 302,202);
insert into B_C_MAP values (406, 302,203);
insert into B_C_MAP values (407, 302,206);
insert into B_C_MAP values (408,303,204);
insert into B_C_MAP values (409, 303,207);
insert into B_C_MAP values (410, 303,208);

【问题讨论】:

  • 首先要尝试在INSERTs 中明确列出目标列,例如INSERT INTO BUSINESS (B_ID, ...) ...

标签: sql oracle


【解决方案1】:

养成在插入上列出您有值的字段的习惯,这样您就不会像以前那样尝试在错误的位置输入它们。

insert into B_C_MAP(b_c_id, c_id, b_id) values (401, 301,201);

insert into B_C_MAP(b_c_id, b_id, c_id) values (401, 201, 301);

【讨论】:

  • 是的,这是最佳做法。 +1
【解决方案2】:

解释:看起来您在 B_C_MAP 插入语句中翻转了 Business 和 Category 的值。

参考资料: http://www.dba-oracle.com/t_ora_02291_integrity_constraint_string_string_violated_parent_key_not_found.htm

示例:

B_ID = 201, 202, 203, 204, 205, 206, 207, 208, 209, 210
C_ID = 301, 302, 303

insert into B_C_MAP values (B_C_ID, B_ID, C_ID);
insert into B_C_MAP values (401, 201, 301);

固定插入语句:

insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (401, 201, 301);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (402, 205, 301);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (403, 209, 301);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (404, 210, 301);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (405, 202, 302);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (406, 203, 302);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (407, 206, 302);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (408, 204, 303);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (409, 207, 303);
insert into B_C_MAP (B_C_ID, B_ID, C_ID) values (410, 208, 303);

【讨论】:

  • 交换值可以解决问题。但是,从长远来看,这是一种糟糕且不安全的做法。 + 1 反正。
【解决方案3】:

插入 B_C_MAP (B_C_ID, C_ID, B_ID) 值 (401, 301,201);

您正在编写交换的值。没有主键值为301BUSINESS。这就是 Oracle 拒绝插入行的原因。

解决方案 #1(首选且安全)

insert into B_C_MAP (B_C_ID, C_ID, B_ID) values (401, 301, 201);

解决方案 #2(惰性且不安全)

insert into B_C_MAP values (401, 201, 301);

【讨论】:

    【解决方案4】:

    我看不到类别和业务表的结构,但似乎必须在业务表之前执行类别插入

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2019-11-05
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多