1. ホーム
  2. sql

[解決済み] ORACLE - プライマリーキーでないキーに NULL 値を挿入することはできません。

2022-02-09 15:21:57

質問

ウェブや様々なフォーラムを検索しましたが、なぜこれがうまくいかないのかがわかりません。私のデータベースは、以下のテーブルで構成されています。

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 を含んでいないことです。

何か見落としている要因があるのでしょうか?多くのフォーラムでは、制約に関連する問題を抱えた人々がいます。私は、競合する制約を見ることができません。

乾杯

解決方法は?

列だけ挿入している ordid , deliveryaddressspidSHOPORDER ということは、他のものはおそらくデフォルトで NULL .

しかし、あなたが宣言した custId として NOT NULL ということで、それは許されない。実はエラーメッセージを見れば、何が不満なのかがわかるのです。

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

明らかに CUSTID の列があり、あなたは 知っている を明示的に設定していないので、デフォルトの値が問題を引き起こしているのでしょう。

この問題を解決するには、そのカラムに特定の値を挿入するか、NULL ではないデフォルト値を指定します。 CUSTOMER テーブルの orderfk1 外部キー制約は失敗します。