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_constraints
和user_cons_columns
意見,看看有什麼約束正在做,但你會發現它比較容易,如果不是讓甲骨文give them default names like SYS_C007155
你name 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_NO
比SYS_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),
...
,但它可能是更清晰,更容易與他們全都在結尾處組合在一起,以維護。