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
In Ihrer Tabelle "Account_holder" gibt es keine Spalte "Account #" – cha