ORACLE - 无法将NULL值插入NON-Primary Key

时间:2013-04-26 04:52:11

标签: sql oracle ora-01400

我搜索了网络和各种论坛,但我无法弄清楚为什么这不起作用。我的数据库由以下表格组成:

CREATE TABLE CUSTOMER(
custid Number(4),
cfirstname varchar2(30),
csurname varchar2(20) NOT NULL, 
billingaddr varchar2(30), 
cgender varchar2(1),
CONSTRAINT custpk PRIMARY KEY (custid),
CONSTRAINT genderconst CHECK(cgender in ('M','F','m','f'))
);

CREATE TABLE PRODUCT(
prodid Number(4),
prodname varchar2(30),
currentprice Number(6,2),
CONSTRAINT cprice_chk CHECK(currentprice >= 0 AND currentprice <=5000 ),
CONSTRAINT prodpk PRIMARY KEY (prodid),
CONSTRAINT pricepos CHECK((currentprice >= 0))
);

CREATE TABLE SALESPERSON(
spid Number(4),
spfirstname varchar2(30),
spsurname varchar2(30),
spgender varchar2(1),
CONSTRAINT salespk PRIMARY KEY (spid)
);

CREATE TABLE SHOPORDER(
ordid Number(4),
deliveryaddress varchar2(30),
custid Number(4) NOT NULL,
spid Number(4) NOT NULL,
CONSTRAINT orderpk PRIMARY KEY (ordid),
CONSTRAINT orderfk1 FOREIGN KEY (custid) REFERENCES CUSTOMER(custid),
CONSTRAINT orderfk2 FOREIGN KEY (spid) REFERENCES SALESPERSON(spid)
);

CREATE TABLE ORDERLINE(
qtysold Number(4),
qtydelivered Number(4),
saleprice Number (6,2),
ordid Number(4) NOT NULL,
prodid Number(4) NOT NULL,
CONSTRAINT qty_chk CHECK (qtydelivered >= 0 AND qtydelivered <=99),
CONSTRAINT price_chk CHECK(saleprice >= 0 AND saleprice <=5000 ),
CONSTRAINT linefk1 FOREIGN KEY (ordid) REFERENCES SHOPORDER(ordid),
CONSTRAINT linefk2 FOREIGN KEY (prodid) REFERENCES PRODUCT(prodid)
);

我正在使用insert语句插入以下内容:

INSERT INTO SHOPORDER(ordid, deliveryaddress, spid)
VALUES (41, NULL, 23);

无论我使用''还是NULL,它都会给我错误:

ORA-01400:无法插入NULL(“S9710647”。“SHOPORDER”。“CUSTID”);

我的问题是我没有将deliveryaddress设置为主键,也不是外键或包含任何NOT NULL CoNSTRAINTS。

我在这里缺少一个因素吗?大多数论坛都有人遇到与限制有关的问题。我看不出任何冲突的约束。

干杯

3 个答案:

答案 0 :(得分:7)

您只是将ordiddeliveryaddressspid列插入SHOPORDER,这意味着其他列可能会默认为NULL

但是,您已将custId声明为NOT NULL,因此不允许这样做。通过查看错误消息,您实际上可以告诉投诉是什么:

ORA-01400: cannot insert NULL into ("S9710647"."SHOPORDER"."CUSTID");
                                                            ^^^^^^

这显然在CUSTID列中出现了问题,并且您知道您没有明确设置它,因此它必须是导致您悲伤的默认值。

您可以通过向该列插入特定值来修复它,或者通过为其提供非NULL默认值来修复它,但您必须确保CUSTOMER表中存在默认值以免orderfk1外键约束失败。

答案 1 :(得分:1)

问题在于:

INSERT INTO SHOPORDER(ordid, deliveryaddress, spid)
VALUES (41, NULL, 23);

使用未指定显式值的所有列的默认值,因此它等效于:

INSERT INTO SHOPORDER(ordid, deliveryaddress, custid, spid)
VALUES (41, NULL, NULL, 23);

违反NOT NULL上的custid约束。

答案 2 :(得分:1)

CREATE TABLE SHOPORDER(
ordid Number(4),
deliveryaddress varchar2(30),
custid Number(4) NOT NULL,
spid Number(4) NOT NULL,
CONSTRAINT orderpk PRIMARY KEY (ordid),
CONSTRAINT orderfk1 FOREIGN KEY (custid) REFERENCES CUSTOMER(custid),
CONSTRAINT orderfk2 FOREIGN KEY (spid) REFERENCES SALESPERSON(spid)
);

INSERT INTO SHOPORDER(ordid, deliveryaddress, spid)
VALUES (41, NULL, 23);

您的问题在于custid,其定义为NOT NULL。您没有为其指定值,因此您尝试将其设置为NULL