复合主键作为外键删除一组删除全部

问题描述 投票:1回答:1

我有两个表,其中一个表有复合主键,另一个表有外键。它们都设置为删除级联。问题是,当我删除时,让我们说一个复合键集“name:John date:02.02.2018”从主表中删除所有John行与外键的表,但是可以有一组“name:John日期:04.04.2018“以及日期为02.02.2018的所有行也被删除,如何删除仅匹配外键集的行?

更新:

CREATE TABLE messages (
    session_date date NOT NULL,
    chat int(11) NOT NULL,
    message longtext NOT NULL,
    date time NOT NULL,
    receiver int(11) NOT NULL,
    PRIMARY KEY (date,receiver),
    KEY FK_messages_sessions (session_date,chat),
    KEY FK_messages_sessions_2 (chat,session_date),
    CONSTRAINT FK_messages_sessions 
        FOREIGN KEY (session_date) 
        REFERENCES sessions (session_date) 
        ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT FK_messages_sessions_2 
       FOREIGN KEY (chat) 
       REFERENCES sessions (chat) 
       ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql sql heidisql
1个回答
2
投票

您已定义了两个外键而不是复合外键。

尝试:

CREATE TABLE `messages` (
  `session_date` date NOT NULL,
  `chat` int(11) NOT NULL,
  `message` longtext NOT NULL,
  `date` time NOT NULL,
  `receiver` int(11) NOT NULL,
  PRIMARY KEY (`date`,`receiver`),
  KEY `FK_messages_sessions` (`session_date`,`chat`),
  CONSTRAINT `FK_messages_sessions` 
      FOREIGN KEY (`session_date`, `chat`) 
      REFERENCES `sessions` (`session_date`, `chat`) 
      ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

(session_date,chat)也可以是(chat,session_date),具体取决于引用表中定义的主键中这些列的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.