2017-08-02 139 views
0
CREATE TABLE Client_master (
    Client_no varchar(6) PRIMARY KEY, 
    Name varchar(15) NOT NULL, 
    City varchar(15), 
    Pincode number(8), 
    State varchar(15), 
    Bal_due Number(10,2), 
    CHECK(Client_no LIKE 'C%')); 

INSERT INTO 
Client_master(Client_no,Name,City,Pincode,State,Bal_due) 
VALUES('C00001','Ivan Bayross','Bombay','400054','Maharashtra',15000); 

1 row created. 

CREATE TABLE Sales_order(
    Order_no varchar(6) PRIMARY KEY REFERENCES Client_master (Client_no), 
    Order_date date, 
    Client_no varchar(6), 
    Dely_type char(1) DEFAULT 'f', 
    Billed_yn char(1), 
    Salesman_no varchar(6), 
    Dely_date date, 
    Order_status varchar(10), 
    CHECK(Order_no LIKE 'O%'), 
    CHECK(Order_status IN ('inprocess','backorder','cancelled')), 
    CHECK(Dely_date>Order_date)); 

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status) 
VALUES('C19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess'); 

INSERT INTO 
* 
ERROR at line 1: 
ORA-02291: integrity constraint (SYSTEM.SYS_C007155) violated - parent key not 
found 

請幫我插入數據到Child表中。 這是什麼SYSTEM.SYS_C007155錯誤?爲什麼此錯誤消息「父鍵未找到」?無法插入數據到oracle11g中帶有外鍵的表

回答

0

parent key not found是因爲您的sales_order表中有一個外鍵,該表指向client_master,並且沒有匹配的鍵值 - 正是它所說的。但是,那是因爲你做了一個奇怪的現象:

Sales_order(Order_no varchar(6) PRIMARY KEY REFERENCES Client_master (Client_no) 

你所做的order_no此表的主鍵,但也它外鍵client_no上其他表。您的插入使用order_no'C19001',它與先前插入到父表中的client_no不匹配。

您幾乎可以肯定想sales_order.client_no是一個外鍵client_master.client_no,所以你將有references...柱:

CREATE TABLE Sales_order(Order_no varchar(6) PRIMARY KEY, 
    Order_date date, 
    Client_no varchar(6) REFERENCES Client_master (Client_no), 
    ... 

你有進一步的問題,因爲你有對order_no檢查約束是CHECK(Order_no LIKE 'O%'),但正如所提到的,你輸入的值是'C19001',它與模式不匹配。據推測你的意思是插入爲'O19001';如果不是,則約束被錯誤地定義。實際上,我在11gR2中的主鍵約束之前打了檢查約束,所以你可能只是在發佈問題時改變了。

你可以看一下在user_constraintsuser_cons_columns意見,看看有什麼約束正在做,但你會發現它比較容易,如果不是讓甲骨文give them default names like SYS_C007155name your constraints

爲約束指定名稱。如果您省略此標識符,則Oracle數據庫將生成一個名稱爲SYS_Cn的表單。 Oracle將完整性約束的名稱和定義存儲在USER_,ALL_和DBA_CONSTRAINTS數據字典視圖中(分別在CONSTRAINT_NAME和SEARCH_CONDITION列中)。

例如:

CREATE TABLE Client_master (
    Client_no varchar(6), 
    Name varchar(15) NOT NULL, 
    City varchar(15), 
    Pincode number(8), 
    State varchar(15), 
    Bal_due Number(10,2), 
    CONSTRAINT Client_master_pk PRIMARY KEY (Client_no), 
    CONSTRAINT Client_master_chk_no CHECK(Client_no LIKE 'C%')); 

INSERT INTO Client_master(Client_no,Name,City,Pincode,State,Bal_due) 
VALUES('C00001','Ivan Bayross','Bombay','400054','Maharashtra',15000); 

1 row inserted. 

CREATE TABLE Sales_order (
    Order_no varchar(6), 
    Order_date date, 
    Client_no varchar(6), 
    Dely_type char(1) DEFAULT 'f', 
    Billed_yn char(1), 
    Salesman_no varchar(6), 
    Dely_date date, 
    Order_status varchar(10), 
    CONSTRAINT Sales_order_pk PRIMARY KEY (Order_no), 
    CONSTRAINT Sales_order_fk_client FOREIGN KEY (Client_no) 
    REFERENCES Client_master (Client_no), 
    CONSTRAINT Sales_order_chk_no CHECK (Order_no LIKE 'O%'), 
    CONSTRAINT Sales_order_shk_status CHECK 
    (Order_status IN ('inprocess','backorder','cancelled')), 
    CONSTRAINT Sales_order_chk_dates CHECK(Dely_date>Order_date)); 

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status) 
VALUES('O19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess'); 

1 row inserted. 

如果你有違規行爲,例如與原來的order_no值,你會看到一個更有用的信息:

INSERT INTO Sales_order(Order_no, Order_date, Client_no, Dely_type, Billed_yn, Salesman_no, Dely_date, Order_status) 
VALUES('C19001','12-jan-96','C00001','f','n','S0001','20-jan-96','inprocess'); 

ORA-02290: check constraint (YOUR_SCHEMA.SALES_ORDER_CHK_NO) violated 

所以你可以有一個更好的主意,其約束侵犯,這意味着什麼,而不必在數據字典廁所。 SALES_ORDER_CHK_NOSYS_C007155更容易理解使用當然有意義的名稱。

可以命名inline constraints太:

CREATE TABLE Client_master (
    Client_no varchar(6) CONSTRAINT Client_master_pk PRIMARY KEY, 
... 

CREATE TABLE Sales_order (
    Order_no varchar(6) CONSTRAINT Sales_order_pk PRIMARY KEY, 
    Order_date date, 
    Client_no varchar(6) CONSTRAINT Sales_order_fk_client REFERENCES Client_master (Client_no), 
... 

,但它可能是更清晰,更容易與他們全都在結尾處組合在一起,以維護。