当前位置: 首页 > 知识库问答 >
问题:

复合主键作为外键删除一组删除所有

夏侯玄天
2023-03-14

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

更新:

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

共有1个答案

乐山
2023-03-14

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

尝试:

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

(会话日期,聊天)也可以是(聊天,会话日期),具体取决于引用表中定义的主键中这些列的顺序。

 类似资料:
  • 问题内容: 我有一个表,该表的主键在其他几个表中使用,并且对其他表有几个外键。 问题是,当我尝试删除外键列之一(即locationIDX)时,它给了我一个错误。 “错误1025(HY000):重命名错误” 如何在没有出现此错误的情况下将列删除到上面的分配表中? 问题答案: 正如解释在这里,似乎外键约束必须由被丢弃 的约束名称 ,而不是索引名。语法为:

  • 问题内容: 我有一个表X,该表具有一个自动递增的ID列作为其主键。我还有其他表A,B,C和D,它们补充了表X中的信息。每个表都必须包含一个引用表X中ID的列。我已经这样做了,并且在我的代码(Java)中,将每个条目的ID返回到表X并在插入其他表时使用该ID的方法。一切都很好。 现在,建议我将表A,B,C和D上的ID列分配为FOREIGN KEYS,因为“这是正确的做法”。我做到了 现在,从表X中删

  • (警告:我不是MySQL专业人士,我使用工作台代替知道命令,所以我的问题可能很简单) 我试图重命名表(user)中的主键(userID),但MySQL不允许(错误号150)。经过一番挖掘,我似乎必须先删除外键,然后才能重命名主键。 因此,在Workbench中,我转到下一个表(问题)并选择alter table,然后转到外键选项卡。我在左侧窗口中选择唯一的外键(fk\u question\u us

  • 问题内容: 我将quartz.net版本从1.0.3升级到2.0.2。有一个用于数据库模式的迁移脚本,该脚本是为MSSQL编写的,并且我正在尝试为其编写MYSQL版本。 但是,我无法删除主键(需要这样做)。 MSSQL的原始脚本版本: 为了简单起见,我正在尝试第一个声明 这是我尝试过的结果: ALTER TABLE BLOB_TRIGGERS DROP PRIMARY KEY; [Err] 102

  • 使用alter命令,我添加了主键和外键 alter table employee1添加主键(eid); alter table accounts1 add foreign key(eid)REFERENCEEE1(eid); 错误: MySQL>alter table employee1删除约束eID; 错误1064(42000):您的SQL语法中有错误;查看将ponds与您的MySQL serv

  • 我试图递归删除JSON对象和所有子对象中的空值。如果子对象的关键点都已删除,则我希望该子对象也被删除。 比如。 应该变成这样: 下面是我编写的删除所有空值键的函数: 但这不会删除没有子项的父项: 因此,我得到的不是上面的结果,而是: 如您所见,它不会删除申请人的密钥。我如何在函数中检查它?或者它是否需要编写在我调用delKeys()后调用的单独函数中? 还有,有人看到这达到了最大递归深度吗?我尝试