无法在Oracle DB表中插入具有FOREIGN KEY的行

hrysbysz  于 2022-12-18  发布在  Oracle
关注(0)|答案(1)|浏览(111)

我想使用以下结构向表中插入行:

CREATE TABLE table_name1 (
        id_name1 NUMBER,
        id_name2 NUMBER,
        id_name3 NUMBER,
        datevalue TIMESTAMP,
        value_name1 NUMBER,
        PRIMARY KEY (id_name1),
    FOREIGN KEY (id_name2) REFERENCES table_name2 (id_name2),
        FOREIGN KEY (id_name3) REFERENCES table_name3 (id_name3)

table_name2为空table_name3包含一些数据
插入查询:

INSERT INTO table_name1 (
    id_name1, 
    id_name2, 
    id_name3, 
    datevalue,  
    value_name1
)
VALUES (
    1, 
    1,  
    1, 
    TO_TIMESTAMP('2020-07-03 13:29:00', 'YYYY-MM-DD HH24:MI:SS'), 
    1
)

执行查询时,我遇到此错误:
SQL错误[2291] [23000]:ORA-02291:违反了完整性约束(SYSTEM.SYS_C008315)-未找到源密钥
错误位置:行:1
我认为在表中插入值的问题与外键。谁能说的问题是什么?

abithluo

abithluo1#

答案很大程度上已经在评论中给出了,但试图写下来。
为了有一个外键,你引用的表必须存在(这使得你的例子不完整,因为其他两个表没有创建),此外,你想要引用的任何键必须存在 * 之前 * 你可以插入东西到你的table_name1
为了把它写下来作为一个比较完整的例子,你也可以使用sqlfiddle:

CREATE TABLE table_name2 (
        id_name2    NUMBER,
        value_name2 NUMBER,
        PRIMARY KEY(id_name2)
);

CREATE TABLE table_name3 (
        id_name3    NUMBER,
        value_name3 NUMBER,
        PRIMARY KEY(id_name3)
);

CREATE TABLE table_name1 (
        id_name1 NUMBER,
        id_name2 NUMBER,
        id_name3 NUMBER,
        datevalue TIMESTAMP,
        value_name1 NUMBER,
        PRIMARY KEY (id_name1),
        FOREIGN KEY (id_name2) REFERENCES table_name2 (id_name2),
        FOREIGN KEY (id_name3) REFERENCES table_name3 (id_name3)    
);

注意,顺序很重要,因为table_name2table_name3必须在table_name1之前创建,否则REFERENCES显然没有任何引用。
插入/选择

INSERT INTO table_name2 (
    id_name2, 
    value_name2
)
VALUES (
    2, -- id_name2
    42
  );

INSERT INTO table_name3 (
    id_name3, 
    value_name3
)
VALUES (
    3, -- id_name2
    999
 );

INSERT INTO table_name1 (
    id_name1, 
    id_name2, 
    id_name3, 
    datevalue,  
    value_name1
)
VALUES (
    1, -- id_name1
    2, -- id_name2
    3, -- id_name3
    TO_TIMESTAMP('2020-07-03 13:29:00', 'YYYY-MM-DD HH24:MI:SS'), 
    1
);

select * from table_name1;
select * from table_name2;
select * from table_name3;

这里的顺序也很重要,因为在table_name1中插入(并引用它们)之前,您首先必须在table_name2table_name3中拥有键

相关问题