【问题标题】:My 'ON DELETE CASCADE ' does not work我的“ON DELETE CASCADE”不起作用
【发布时间】:2011-05-29 05:19:55
【问题描述】:

我有 3 张桌子:lt_hdefaultslt_hperiodslt_hrules。在lt_hdefaults 中,有一行表示特定年份的属性。在lt_hperiods 表中,可能有多个时期,称为季节。在lt_hrules 表中,每个期间可能有多个规则。现在,我无法解决的问题:当用户从lt_hdefaults 中删除一条记录时,应从lt_hperiodslt_hrules 表中删除与已删除记录相关的其他数据。我正在尝试通过使用

来实现这一点
FOREIGN KEY (lt_year,lt_id) REFERENCES lt_hdefaults(lt_year,lt_id) ON DELETE CASCADE

但是,它不起作用。我知道它看起来很长,但它不是很复杂。如果有人有任何想法,我将不胜感激。我知道如何使用 mysql,但我不是这方面的专家。非常感谢。

以下示例:

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

【问题讨论】:

    标签: mysql cascade cascading-deletes


    【解决方案1】:

    ENGINE=MyISAM

    【讨论】:

    • 非常感谢,这适用于额外的修改..(对于面临同样问题的其他人,我也会添加另一个答案..)
    【解决方案2】:

    对于外键引用使用innoDB

    【讨论】:

      【解决方案3】:

      类似这样的工作..作为一个例子:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 2015-12-31
        相关资源
        最近更新 更多