2017-03-08 95 views
0

我正在嘗試添加刪除級聯,以滿足以下規則... •如果刪除了賬戶持有人,則必須刪除屬於該賬戶持有人的所有賬戶。嘗試刪除SQL上的級聯加

我得到一個錯誤「沒有匹配的唯一鍵」和「無效的」

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)); 

ALTER table ACCOUNT_HOLDER 
ADD CONSTRAINT fk_account FOREIGN KEY (Account#) REFERENCES ACCOUNT (Account#) ON DELETE CASCADE; 
+0

您的Account_holder表中沒有「Account#」列 – cha

回答

0

級聯外鍵必須放置在相關數據。在這種情況下,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