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
错误是什么?为什么找不到此错误消息"父键"?
答案 0 :(得分: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_constraints
和user_cons_columns
视图,了解约束的作用,但如果您name your constraints而不是让Oracle {{3},您会发现它更容易}:
指定约束的名称。如果省略此标识符,则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
更易于解释当然使用对您有意义的名称。
您也可以命名give them default names like SYS_C007155
:
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),
...
但是最后可能会更清晰,更容易维护,所有这些组合在一起。