繁体   English   中英

无法使用外键在 Oracle 数据库表中插入行

[英]Cannot insert row in Oracle DB table with FOREIGN KEY

我想用这种结构向表中插入行:

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

我认为在使用外键向表中插入值时存在问题。 谁能说说是什么问题?

答案大部分在评论里给出了,但试着写下来。

为了拥有外键,您所引用的表必须存在(这使得您的示例有些不完整,因为未创建其他两个表),此外,您要引用的任何键都必须存在才能将东西插入您的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_name1之前创建table_name2table_name3中的顺序,否则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_name2table_name3中拥有键,然后才能在table_name1中插入(并因此引用它们)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM