2017-03-08 9 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 
関連する問題