2010-12-22 12 views
1

Ich habe 3 Tabellen: lt_hdefaults, lt_hperiods und lt_hrules. In lt_hdefaults gibt es eine Zeile für eine Eigenschaft für ein bestimmtes Jahr. In der lt_hperiods Tabelle, könnte es mehr als eine Periode geben, nennen sie Jahreszeiten. In der Tabelle lt_hrules kann für jede Periode mehr als eine Regel vorhanden sein. Nun, was ich nicht arbeiten konnte: wenn der Benutzer einen Datensatz von lt_hdefaults löscht, sollten andere Daten im Zusammenhang mit dem gelöschten Datensatz aus lt_hperiods und lt_hrules Tabelle entfernt werden. Ich versuche, dies zu erreichen, indem SieMein 'ON DELETE CASCADE' funktioniert nicht

FOREIGN KEY (lt_year,lt_id) REFERENCES lt_hdefaults(lt_year,lt_id) ON DELETE CASCADE 

verwenden, aber es funktioniert nicht. Ich weiß, es sieht lang aus, aber es ist nicht sehr kompliziert. Wenn jemand eine Idee hat, würde ich es begrüßen. Ich weiß, wie man mysql benutzt, aber ich bin kein Experte dafür. Vielen Dank.

Proben unter:

CREATE TABLE IF NOT EXISTS lt_hdefaults (
    lt_year year(4) NOT NULL DEFAULT '0000', 
    lt_id int(255) NOT NULL DEFAULT '0', 
    period_name varchar(45) NOT NULL DEFAULT 'Default', 
    min_stay int(10) NOT NULL DEFAULT '1', 
    max_stay int(10) NOT NULL, 
    weekly_rate float(10,2) NOT NULL, 
    nightly_rate float(10,2) NOT NULL, 
    PRIMARY KEY (lt_year,lt_id) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  

CREATE TABLE IF NOT EXISTS lt_hperiods (
    period_id int(255) NOT NULL , 
    lt_id int(255) NOT NULL, 
    lt_year year(4) NOT NULL DEFAULT '0000', 
    period_name varchar(45) NOT NULL, 
    min_stay int(10) NOT NULL, 
    max_stay int(10) NOT NULL, 
    fromDate date NOT NULL, 
    toDate date NOT NULL, 
    weekly_rate float(10,2) DEFAULT NULL, 
    nightly_rate float(10,2) NOT NULL, 
    arriveDepartDays varchar(150) DEFAULT 'sunday,monday,tuesday,wednesday,thursday,friday,saturday', 
    noArriveDepartDays varchar(150) DEFAULT NULL, 
    PRIMARY KEY (period_id), 
    FOREIGN KEY (lt_year,lt_id) REFERENCES lt_hdefaults(lt_year,lt_id) ON DELETE CASCADE 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=107 ;  

CREATE TABLE IF NOT EXISTS lt_hrules (
    period_id int(255) NOT NULL, 
    lt_id int(255) NOT NULL, 
    lt_year year(4) NOT NULL DEFAULT '0000', 
    rule_name varchar(45) NOT NULL, 
    night_of_stay int(10) NOT NULL, 
    fixed_rate float(10,2) NOT NULL, 
    PRIMARY KEY (period_id,lt_id,night_of_stay), 
    FOREIGN KEY (period_id) REFERENCES lt_hperiods(period_id) ON DELETE CASCADE 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;  

INSERT INTO lt_hdefaults (lt_year, lt_id, period_name, min_stay, max_stay, weekly_rate, nightly_rate, min_guests, max_guests, surchargeAboveGuests, chargePerGuestFee, bondFee, cleaningFee, bookingServiceFee) VALUES 
(2010, 2, 'Default', 0, 0, 1200.00, 171.43, 2, 5, 6, 85.00, 1000.00, 120.00, 0.00), 
(2010, 3, 'Default', 0, 0, 1300.00, 185.71, 2, 5, 6, 44.00, 1000.00, 120.00, 0.00); 

INSERT INTO lt_hperiods (period_id, lt_id, lt_year, period_name, min_stay, max_stay, fromDate, toDate, weekly_rate, nightly_rate, arriveDepartDays, noArriveDepartDays) VALUES 
(105, 3, 2010, 'winter', 2, 66, '2010-12-22', '2011-01-15', 1500.00, 214.29, 'Monday,Tuesday,Wednesday,Thursday', 'Friday,Saturday,Sunday'), 
(106, 3, 2010, 'summer', 2, 77, '2011-01-14', '2011-01-28', 4000.00, 571.43, 'Monday,Tuesday,Wednesday,Thursday,Friday,Saturday', 'Sunday'); 

INSERT INTO lt_hrules (period_id, lt_id, lt_year, rule_name, night_of_stay, fixed_rate) VALUES 
(106, 3, 2010, 'r2', 2, 222.00), 
(106, 3, 2010, 'r1', 1, 111.00), 
(105, 3, 2010, 'r2', 2, 222.00), 
(105, 3, 2010, 'r1', 1, 111.00); 

Antwort

6

ENGINE=MyISAM < - MyISAM unterstützt keine Art von Fremdschlüsseln. Verwenden Sie stattdessen InnoDB.

+0

Vielen Dank, diese mit zusätzlichen Änderungen funktioniert .. (Für andere Menschen, die mit dem gleichen Problem konfrontiert , Ich werde eine weitere Antwort hinzufügen ..) – user403295

1

für Fremdschlüssel Referenzierung Verwendung innoDB

0

So etwas works..as ein Beispiel:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

CREATE TABLE IF NOT EXISTS lt_hperiods ( 
    period_id   int(255)  NOT NULL, 
    lt_id    int(255)  NOT NULL, 
    lt_year   year(4)  NOT NULL DEFAULT '0000', 
    period_name  varchar(45) NOT NULL, 
    min_stay   int(10)  NOT NULL, 
    max_stay   int(10)  NOT NULL, 
    fromDate   date   NOT NULL, 
    toDate    date   NOT NULL, 
    weekly_rate  float(10,2) DEFAULT NULL, 
    nightly_rate  float(10,2) NOT NULL, 
    arriveDepartDays varchar(150) DEFAULT 'sunday,monday,tuesday,wednesday,thursday,friday,saturday', 
    noArriveDepartDays varchar(150) DEFAULT NULL, 

    PRIMARY KEY (period_id), 
    INDEX (lt_id), 
    INDEX (lt_year), 
    CONSTRAINT FOREIGN KEY (`lt_id`, `lt_year`) 
    REFERENCES lt_hdefaults(`lt_id`, `lt_year`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=107; 



SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

CREATE TABLE IF NOT EXISTS lt_hrules (
    period_id  int(255)  NOT NULL, 
    lt_id   int(255)  NOT NULL, 
    lt_year  year(4)  NOT NULL DEFAULT '0000', 
    rule_name  varchar(45) NOT NULL, 
    night_of_stay int(10)  NOT NULL, 
    fixed_rate  float(10,2) NOT NULL, 

    PRIMARY KEY (period_id,lt_id,night_of_stay), 
    INDEX(period_id), 
    CONSTRAINT FOREIGN KEY (`period_id`) 
    REFERENCES lt_hperiods(`period_id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
Verwandte Themen