2013-04-26 6 views
2

Я искал в Интернете и на разных форумах, но не могу понять, почему это не сработает. Моя база данных состоит из следующих таблиц:ORACLE - Невозможно вставить значение NULL в N-Primary Key

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 INTO SHOPORDER(ordid, deliveryaddress, spid) 
VALUES (41, NULL, 23); 

использовать ли я «» или NULL дает мне ошибку:

ORA-01400: не может вставить NULL в («S9710647». «SHOPORDER». «CUSTID»);

Моя проблема в том, что я не установил адрес доставки в качестве основного ключа, а также не является внешним ключом или не содержал NOT NULL CoNSTRAINTS.

Есть ли фактор, который мне не хватает здесь? На большинстве форумов были люди с проблемами, связанными с ограничениями. Я не вижу противоречивых ограничений.

Приветствия

ответ

5

Вы только вставив столбцы ordid, deliveryaddress и spid в SHOPORDER что означает, что другие, вероятно, по умолчанию NULL.

Однако, вы указали custId как NOT NULL, так что это запрещено. Вы действительно можете сказать, что жалоба, глядя на сообщение об ошибке:

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

Это явно имеет проблемы с CUSTID колонки, и вы знаете вы явно не установить, что, поэтому он должен быть по умолчанию значение, вызывающее у вас горе.

Вы можете исправить это путем либо вставки определенного значения в этот столбец, либо путем присвоения ему значения по умолчанию, отличного от NULL, хотя вы должны убедиться, что по умолчанию в таблице нет значения orderfk1 ограничение внешнего ключа не удастся.

+0

Отличный ответ! Спасибо, что поняли это для меня. –

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.

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.