Oracle 数据库查询问题 - 插入数据的问题

Posted

技术标签:

【中文标题】Oracle 数据库查询问题 - 插入数据的问题【英文标题】:Oracle database query issue - issues inserting data 【发布时间】:2015-03-08 19:53:39 【问题描述】:

我目前正在做一个数据库练习练习,但我在输入数据时遇到了问题,因为我收到了外键错误。

这里列出了我的成功

CREATE TABLE EMPLOYEE 
(
    FNAME VARCHAR2(15) NOT NULL,
    MINIT CHAR,LNAME VARCHAR2(15) NOT NULL,
    SSN CHAR(9) NOT NULL,
    BDATE DATE,
    ADDRESS VARCHAR2(30),
    SEX CHAR(1),
    SALARY NUMBER(10,2),
    SUPER_SSN CHAR(9),
    DNO NUMBER NOT NULL,

    CONSTRAINT EMPPK PRIMARY KEY (SSN) DISABLE,
    CONSTRAINT EMPSUPERFK FOREIGN KEY (SUPER_SSN) REFERENCES EMPLOYEE(SSN) DISABLE
);

表创建成功

CREATE TABLE DEPARTMENT 
(
     DNAME VARCHAR2(15) NOT NULL,
     DNUMBER NUMBER  NOT NULL,
     MGR_SSN CHAR(9) NOT NULL,
     MGR_START_DATE DATE,
     CONSTRAINT DEPTPK PRIMARY KEY (DNUMBER) DISABLE,
     CONSTRAINT DEPTMGRFK FOREIGN KEY (MGR_SSN) REFERENCES EMPLOYEE(SSN) DISABLE
);

表创建成功

ALTER TABLE DEPARTMENT ENABLE constraint DEPTPK;

成功改表

alter table EMPLOYEE 
  add constraint fk_d_num 
  FOREIGN KEY (DNO) references DEPARTMENT (DNUMBER);

成功改表

select distinct(TABLE_NAME), constraint_name, constraint_type, status
from all_constraints 
where TABLE_NAME in('EMPLOYEE', 'DEPARTMENT');

成功显示表,包含状态和全部

现在是时候插入数据了

我使用了文档中的命令

insert into EMPLOYEE 
values ('Jonn', 'B', 'Smith','123456789', '09-FEB-1965', '731 Fondren, Houston, TX','M', 30000, '333445555', 5)

我得到的错误状态

从第 1 行开始的错误命令 - 插入 EMPLOYEE 值('Jonn','B','Smith','123456789','09-FEB-1965','731 Fondren,Houston,TX','M',30000,'333445555',5) 错误报告 SQL 错误:ORA-02291:违反完整性约束 (PA96.FK_D_NUM) - 未找到父键 02291. 00000 - “违反完整性约束 (%s.%s) - 未找到父键” 原因:外键值没有匹配的主键值。 行动:删除外键或添加匹配的主键。

好的,看来我需要先处理部门表。仍然遇到同样的问题

我得出一个结论,我需要引用我插入的每个数据。

我得到的示例查询提示是:

INSERT INTO Employee (Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn, Dno)
VALUES ('Franklin', 'T', 'Wong', 333445555, '1955-12-08', '638 Voss, Houston, TX', M, 40000, 888665555, 5);

我尝试的部门表仍然失败:

INSERT INTO Department (Dname, Dnumber, Mgr_ssn, Mgr_start_date)
VALUES ('Research', 5, 333445555, To_date('1988-05-22', ‘YYYY-MM-DD’));

我还是失败了。我该如何解决这个问题。日期格式是部门表和员工表所需要的,但我一直失败。

请有人帮忙。我需要在下面加载这些

INSERT INTO Employee (Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn, Dno) 
VALUES ('Jonn', 'B', 'Smith', 123456789, '1965-02-09', '731 Fondren, Houston, TX', M, 30000, 333445555, 5)

进入Employee

INSERT INTO Department (Dname, Dnumber, Mgr_ssn, Mgr_start_date)
VALUES ('Research', 5, 333445555, '1988-05-22')

进入Department 表。

使用 Oracle。

谢谢。

【问题讨论】:

【参考方案1】:

就像您注意到需要在员工之前插入部门一样:

INSERT INTO Department (Dname, Dnumber, Mgr_ssn, Mgr_start_date)
VALUES ('Research', 5, 333445555, To_date('1988-05-22', 'YYYY-MM-DD'));

INSERT INTO EMPLOYEE VALUES 
('Jonn', 'B', 'Smith','123456789', '09-FEB-1965', '731 Fondren, Houston, TX','M', 30000, '333445555', 5);

插入到部门的问题是这部分To_date('1988-05-22', ‘YYYY-MM-DD’) 包含无效字符(日期格式文字周围的引号)。应该和上面一样。

Sample SQL Fiddle

【讨论】:

以上是关于Oracle 数据库查询问题 - 插入数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 数据库查询问题 - 插入数据的问题

在 ORACLE 插入查询中选择查询

关于oracle in 的1000条限制

oracle数据库乱码问题,数据库无法插入中文,请路过的大神帮忙看看

如何查询oracle某个时间的连接数

oracle 将查询结果赋值给变量