2017-03-08 1 views
0
zu löschen

Ich versuche, Löschkaskade hinzuzufügen, damit die folgende Regel erfüllt wird ... • Wenn ein Kontoinhaber gelöscht wird, müssen alle Konten gelöscht werden, die zu diesem Kontoinhaber gehören.Versuch, Kaskade auf SQL plus

ich bin immer einen Fehler für ‚keine passenden eindeutigen Schlüssel‘ und ‚ungültige Kennung‘

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

In Ihrer Tabelle "Account_holder" gibt es keine Spalte "Account #" – cha

Antwort

0

Die kaskadierende Fremdschlüssel muss auf die abhängigen Daten gestellt werden. In diesem Fall muss ACCOUNT den Fremdschlüssel anstelle von ACCOUNT_HOLDER haben.
Es ist im Allgemeinen eine gute Idee, auch kaskadierende fremdcodierte Spalten in der abhängigen Tabelle zu indizieren.
Eine überarbeitete Version unten ist mit Beispiel in SQLPlus löscht (I, kommentierte den Fremdschlüssel für Kunden wie die Tabelle nicht im Beispiel)

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

Im Folgenden ein Beispiel Kaskade in SQLPlus ist:

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