級聯外鍵必須放置在相關數據。在這種情況下,ACCOUNT
必須具有外鍵而不是ACCOUNT_HOLDER
。
通常,在依賴表中對級聯外鍵列進行索引通常是一個好主意。
修改後的版本是以下例子,在sqlplus中刪除(我評論外鍵以客戶爲表不在的例子)
CREATE TABLE ACCOUNT_HOLDER
(
CUST_ID NUMBER(5) CONSTRAINT PK_CUSTID PRIMARY KEY,
BIRTHDAY DATE,
GENDER CHAR(1) CONSTRAINT CK_GENDER CHECK (GENDER IN ('M', 'F')),
STREET VARCHAR2(20),
ZIPCODE NUMBER(5),
CITY VARCHAR2(30),
EMAIL VARCHAR2(30),
-- CONSTRAINT fk_email FOREIGN KEY (email) REFERENCES Customer (email),
CONSTRAINT CK_EMAIL UNIQUE (EMAIL)
);
CREATE TABLE ACCOUNT
(
ACCOUNT# NUMBER(5) CONSTRAINT PK_ACCOUNT PRIMARY KEY,
PAYMENT_TYPE VARCHAR2(15) CONSTRAINT CK_PAYMENT CHECK (PAYMENT_TYPE IN ('Cash', 'Check', 'Credit', 'Debit')),
DATE_CREATED DATE,
CUST_ID NUMBER(5) REFERENCES ACCOUNT_HOLDER (CUST_ID) ON DELETE CASCADE
);
CREATE INDEX ACCOUNT_ACCOUNT_HOLDER_FKI
ON ACCOUNT (CUST_ID);
下面是在sqlplus一個示例級聯:
SQL> INSERT INTO ACCOUNT_HOLDER (CUST_ID, BIRTHDAY, GENDER, STREET, ZIPCODE, CITY, EMAIL) VALUES
(1, SYSDATE, 'F', NULL, NULL, NULL, '[email protected]'); 2
1 row created.
SQL>
SQL> INSERT INTO ACCOUNT_HOLDER (CUST_ID, BIRTHDAY, GENDER, STREET, ZIPCODE, CITY, EMAIL) VALUES
(2, SYSDATE, 'M', NULL, NULL, NULL, '[email protected]'); 2
1 row created.
SQL> INSERT INTO ACCOUNT (ACCOUNT#, PAYMENT_TYPE, DATE_CREATED, CUST_ID) VALUES
(1, 'Debit', SYSDATE, 1); 2
1 row created.
SQL>
SQL> INSERT INTO ACCOUNT (ACCOUNT#, PAYMENT_TYPE, DATE_CREATED, CUST_ID) VALUES
(2, 'Debit', SYSDATE, 1); 2
1 row created.
SQL> INSERT INTO ACCOUNT (ACCOUNT#, PAYMENT_TYPE, DATE_CREATED, CUST_ID) VALUES
(3, 'Debit', SYSDATE, 2); 2
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT COUNT(*) FROM ACCOUNT;
COUNT(*)
----------
3
SQL> DELETE FROM ACCOUNT_HOLDER WHERE CUST_ID = 1;
1 row deleted.
SQL> SELECT COUNT(*) FROM ACCOUNT;
COUNT(*)
----------
1
您的Account_holder表中沒有「Account#」列 – cha