违反了完整性约束 (SYSTEM.FK_FACILITY) - 未找到父键
Integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found
我收到 "integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found" 错误,尽管主键已在前面 table.
中明确定义
CREATE TABLE Facility (
facNo CHAR(11) NOT NULL,
facName VARCHAR(30) NOT NULL,
CONSTRAINT FacilityPK PRIMARY KEY (facNo)
);
INSERT INTO Facility (facNo, facName) VALUES ('F100', 'Football stadium');
INSERT INTO Facility (facNo, facName) VALUES ('F101', 'Basketball arena');
CREATE TABLE Customer (
custNo CHAR(8) NOT NULL,
custName VARCHAR(30) NOT NULL,
address VARCHAR(50) NOT NULL,
internal CHAR(10) NOT NULL,
city VARCHAR(30) NOT NULL,
zip VARCHAR(10) NOT NULL,
state1 VARCHAR(2) NOT NULL,
contact VARCHAR(50) NOT NULL,
phone VARCHAR(30) NOT NULL,
CONSTRAINT CustomerPk PRIMARY KEY (custNo)
);
INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
('C100', 'Football', 'Box 352200', 'True', 'Boulder', '80309', 'CO', 'Mary Manager', '6857100');
INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
('C101', 'Men''s Basketball', 'Box 352400', 'TRUE' , 'Boulder', '80309', 'CO', 'Sally Supervisor', '5431700');
CREATE TABLE EventReq (
evntNo CHAR(8) NOT NULL,
custNo CHAR(8) NOT NULL,
facNo CHAR(8) NOT NULL,
dateHeld DATE NOT NULL,
dateReq DATE NOT NULL,
dateAuth DATE,
status CHAR(20) NOT NULL,
estCost DECIMAL(8, 2) NOT NULL,
estAudience INTEGER NOT NULL,
budNo CHAR(30),
CONSTRAINT EventReqtPK PRIMARY KEY (evntNo),
CONSTRAINT FK_Facility FOREIGN KEY (facNo) REFERENCES Facility (facNo),
CONSTRAINT FK_Customer FOREIGN KEY (custNo) REFERENCES Customer (custNo)
);
INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000');
我的确切错误是
INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000')
Error report -
ORA-02291: integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found
我只想将值添加到 table 但我无法这样做...
如果有人能帮助我,那就太好了!
CHAR
是一个糟糕的选择,除非您知道所有值都是固定长度的。为什么?因为 Oracle 用空格右填充这些值,直到最大列长度。
这就是你所做的:
SQL> desc facility;
Name Null? Type
----------------------------------------- -------- ----------------------------
FACNO NOT NULL CHAR(11) --> 11 characters
FACNAME NOT NULL VARCHAR2(30)
SQL> select facno, length(facno) lenfac, 'x' || facno ||'x' xfac from facility;
FACNO LENFAC XFAC
----------- ---------- -------------
F100 11 xF100 x
F101 11 xF101 x
-------
1234567 spaces
SQL>
看到了吗?
- 列长度 = 11
- 您存储的值是
F100
- 存储为
F100
+7个空格,共11个字符
插入 eventreq
table 时不会有问题,但是 - 你说它在 facno
列中接受 11 个字符:
SQL> desc eventreq
Name Null? Type
----------------------------------------- -------- ----------------------------
EVNTNO NOT NULL CHAR(8)
CUSTNO NOT NULL CHAR(8)
FACNO NOT NULL CHAR(8) --> 8 characters
DATEHELD NOT NULL DATE
DATEREQ NOT NULL DATE
DATEAUTH DATE
STATUS NOT NULL CHAR(20)
ESTCOST NOT NULL NUMBER(8,2)
ESTAUDIENCE NOT NULL NUMBER(38)
BUDNO CHAR(30)
SQL>
这意味着 - 当您在 eventreq
table 中插入一行时,facno = F100
被右侧填充的空格达到此处的列长度 8 个字符(即 F100
+ 4 个空格)。
比较:
facility - facno char(11)
eventreq - facno char(8)
F100 右填充到 8 个字符与 F100 右填充到 11 个字符不同,这就是为什么 Oracle 说找不到匹配的父键。
怎么办?
- 将
facility
table 中的 facno
列缩短为 8 个字符
- 或将
eventreq
中的该列扩大到 11 个字符
- 将数据类型更改为
VARCHAR2
例如,如果两列都是 CHAR(8)
:
SQL> desc facility
Name Null? Type
----------------------------------------- -------- ----------------------------
FACNO NOT NULL CHAR(8)
FACNAME NOT NULL VARCHAR2(30)
SQL> select * From facility;
FACNO FACNAME
-------- ------------------------------
F100 Football stadium
SQL> desc eventreq;
Name Null? Type
----------------------------------------- -------- ----------------------------
EVNTNO NOT NULL CHAR(8)
CUSTNO NOT NULL CHAR(8)
FACNO NOT NULL CHAR(8)
DATEHELD NOT NULL DATE
DATEREQ NOT NULL DATE
DATEAUTH DATE
STATUS NOT NULL CHAR(20)
ESTCOST NOT NULL NUMBER(8,2)
ESTAUDIENCE NOT NULL NUMBER(38)
BUDNO CHAR(30)
SQL> INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
2 VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Appr
oved', 5000.00, 80000, 'B1000');
1 row created.
SQL>
有效。
最后,一个巨大的错误:
SYSTEM.FK_FACILITY
除了数据库管理之外,不要使用 SYSTEM
(也不 SYS
)用户。它们不应该用于像您这样的目的。
我收到 "integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found" 错误,尽管主键已在前面 table.
中明确定义CREATE TABLE Facility (
facNo CHAR(11) NOT NULL,
facName VARCHAR(30) NOT NULL,
CONSTRAINT FacilityPK PRIMARY KEY (facNo)
);
INSERT INTO Facility (facNo, facName) VALUES ('F100', 'Football stadium');
INSERT INTO Facility (facNo, facName) VALUES ('F101', 'Basketball arena');
CREATE TABLE Customer (
custNo CHAR(8) NOT NULL,
custName VARCHAR(30) NOT NULL,
address VARCHAR(50) NOT NULL,
internal CHAR(10) NOT NULL,
city VARCHAR(30) NOT NULL,
zip VARCHAR(10) NOT NULL,
state1 VARCHAR(2) NOT NULL,
contact VARCHAR(50) NOT NULL,
phone VARCHAR(30) NOT NULL,
CONSTRAINT CustomerPk PRIMARY KEY (custNo)
);
INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
('C100', 'Football', 'Box 352200', 'True', 'Boulder', '80309', 'CO', 'Mary Manager', '6857100');
INSERT INTO Customer (custNo, custName, address, internal, city, zip, state1, contact, phone) VALUES
('C101', 'Men''s Basketball', 'Box 352400', 'TRUE' , 'Boulder', '80309', 'CO', 'Sally Supervisor', '5431700');
CREATE TABLE EventReq (
evntNo CHAR(8) NOT NULL,
custNo CHAR(8) NOT NULL,
facNo CHAR(8) NOT NULL,
dateHeld DATE NOT NULL,
dateReq DATE NOT NULL,
dateAuth DATE,
status CHAR(20) NOT NULL,
estCost DECIMAL(8, 2) NOT NULL,
estAudience INTEGER NOT NULL,
budNo CHAR(30),
CONSTRAINT EventReqtPK PRIMARY KEY (evntNo),
CONSTRAINT FK_Facility FOREIGN KEY (facNo) REFERENCES Facility (facNo),
CONSTRAINT FK_Customer FOREIGN KEY (custNo) REFERENCES Customer (custNo)
);
INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000');
我的确切错误是
INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Approved', 5000.00, 80000, 'B1000')
Error report -
ORA-02291: integrity constraint (SYSTEM.FK_FACILITY) violated - parent key not found
我只想将值添加到 table 但我无法这样做... 如果有人能帮助我,那就太好了!
CHAR
是一个糟糕的选择,除非您知道所有值都是固定长度的。为什么?因为 Oracle 用空格右填充这些值,直到最大列长度。
这就是你所做的:
SQL> desc facility;
Name Null? Type
----------------------------------------- -------- ----------------------------
FACNO NOT NULL CHAR(11) --> 11 characters
FACNAME NOT NULL VARCHAR2(30)
SQL> select facno, length(facno) lenfac, 'x' || facno ||'x' xfac from facility;
FACNO LENFAC XFAC
----------- ---------- -------------
F100 11 xF100 x
F101 11 xF101 x
-------
1234567 spaces
SQL>
看到了吗?
- 列长度 = 11
- 您存储的值是
F100
- 存储为
F100
+7个空格,共11个字符
插入 eventreq
table 时不会有问题,但是 - 你说它在 facno
列中接受 11 个字符:
SQL> desc eventreq
Name Null? Type
----------------------------------------- -------- ----------------------------
EVNTNO NOT NULL CHAR(8)
CUSTNO NOT NULL CHAR(8)
FACNO NOT NULL CHAR(8) --> 8 characters
DATEHELD NOT NULL DATE
DATEREQ NOT NULL DATE
DATEAUTH DATE
STATUS NOT NULL CHAR(20)
ESTCOST NOT NULL NUMBER(8,2)
ESTAUDIENCE NOT NULL NUMBER(38)
BUDNO CHAR(30)
SQL>
这意味着 - 当您在 eventreq
table 中插入一行时,facno = F100
被右侧填充的空格达到此处的列长度 8 个字符(即 F100
+ 4 个空格)。
比较:
facility - facno char(11)
eventreq - facno char(8)
F100 右填充到 8 个字符与 F100 右填充到 11 个字符不同,这就是为什么 Oracle 说找不到匹配的父键。
怎么办?
- 将
facility
table 中的facno
列缩短为 8 个字符- 或将
eventreq
中的该列扩大到 11 个字符
- 或将
- 将数据类型更改为
VARCHAR2
例如,如果两列都是 CHAR(8)
:
SQL> desc facility
Name Null? Type
----------------------------------------- -------- ----------------------------
FACNO NOT NULL CHAR(8)
FACNAME NOT NULL VARCHAR2(30)
SQL> select * From facility;
FACNO FACNAME
-------- ------------------------------
F100 Football stadium
SQL> desc eventreq;
Name Null? Type
----------------------------------------- -------- ----------------------------
EVNTNO NOT NULL CHAR(8)
CUSTNO NOT NULL CHAR(8)
FACNO NOT NULL CHAR(8)
DATEHELD NOT NULL DATE
DATEREQ NOT NULL DATE
DATEAUTH DATE
STATUS NOT NULL CHAR(20)
ESTCOST NOT NULL NUMBER(8,2)
ESTAUDIENCE NOT NULL NUMBER(38)
BUDNO CHAR(30)
SQL> INSERT INTO EventReq (evntNo, custNo, facNo, dateHeld, dateReq, dateAuth, status, estCost, estAudience, budNo)
2 VALUES ('E100', 'C100', 'F100', TO_DATE('2013-10-25','YYYY-MM-DD'), TO_DATE('2013-06-06','YYYY-MM-DD'), TO_DATE('2013-06-08','YYYY-MM-DD'), 'Appr
oved', 5000.00, 80000, 'B1000');
1 row created.
SQL>
有效。
最后,一个巨大的错误:
SYSTEM.FK_FACILITY
除了数据库管理之外,不要使用 SYSTEM
(也不 SYS
)用户。它们不应该用于像您这样的目的。