簡體   English   中英

mysql-外鍵級聯更新

[英]mysql - foreign key cascade update

我有一個關於如何使用第二個字段作為約束的級聯更新字段的問題。

結構是這樣的(我刪除了不必要的列):

具有idNodeidDimension列的表nodes (它們一起構成主鍵)。

forces使用idForce (PK), idNodenodes外鍵idNode )和idDimension

級聯更新和刪除所有內容。

這種結構中似乎出現的問題是:

如果在nodes我有一個條目(1,1)和一個類似(1,2)且在forces (1,1,1)和(1,1,2)中並且我從nodes更新或刪除了第一個條目在forces將受到影響。

我只需要影響也具有相應idDimension的那個。 我該如何修改當前結構?

編輯:表格-節點:

CREATE TABLE IF NOT EXISTS `nodes` (
  `idNode` varchar(11) NOT NULL,
  `idDimension` int(10) unsigned NOT NULL,
  `idNetwork` int(10) unsigned NOT NULL DEFAULT '0',
  `level` int(11) unsigned NOT NULL DEFAULT '0',
  `energy` bigint(20) DEFAULT NULL,
  `resources` bigint(20) unsigned NOT NULL DEFAULT '0',
  `x` int(11) NOT NULL,
  `y` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `order` tinyint(3) DEFAULT '0' COMMENT 'energy 0\nassemble 1\nupgrade 2',
  `core` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`idNode`,`idDimension`),
  KEY `network_dimension` (`idDimension`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Node table';

軍隊:

 CREATE TABLE IF NOT EXISTS `forces` (
  `idForce` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `idNode` varchar(11) NOT NULL,
  `idDimension` int(10) unsigned NOT NULL,
  `drones` bigint(20) DEFAULT NULL,
  `stance` tinyint(3) DEFAULT NULL COMMENT '0 - defense\n1 - neutral\n2 - attack      \n\nIf planet is parano and you are not allied to owner you can only be in attack.\n\nIf owner is allied you can only be in defense or neutral.\n\nIf you are owner you can only be in defense.',
   `order` tinyint(3) DEFAULT '0' COMMENT 'extract energy 1\nbuild node 2\nreplicate 3\nmove 4',
  `value` text,
   PRIMARY KEY (`idForce`),
   KEY `idNode` (`idNode`,`idDimension`),
   KEY `idDimension` (`idDimension`)
  ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

-

-約束表forces

  ALTER TABLE `forces`
    ADD CONSTRAINT `forces_ibfk_2` FOREIGN KEY (`idDimension`) REFERENCES `nodes`  (`idDimension`) ON DELETE CASCADE ON UPDATE CASCADE,
    ADD CONSTRAINT `fk_forces_nodes1` FOREIGN KEY (`idNode`, `idDimension`) REFERENCES `nodes` (`idNode`, `idDimension`) ON DELETE NO ACTION ON UPDATE NO ACTION,
    ADD CONSTRAINT `forces_ibfk_1` FOREIGN KEY (`idNode`) REFERENCES `nodes` (`idNode`) ON DELETE CASCADE ON UPDATE CASCADE;

我的約束無法正常運行,請隨時忽略它們:)。

有兩個奇怪的外鍵( forces_ibfk_1forces_ibfk_2 ),它們引用非唯一字段。 刪除它們-

ALTER TABLE forces DROP FOREIGN KEY forces_ibfk_1;
ALTER TABLE forces DROP FOREIGN KEY forces_ibfk_2;

然后使用CASCADE操作選項重新創建引用唯一字段對的fk_forces_nodes1

ALTER TABLE forces
  DROP FOREIGN KEY fk_forces_nodes1;

ALTER TABLE orces
  ADD CONSTRAINT fk_forces_nodes1 FOREIGN KEY (idNode, idDimension)
    REFERENCES nodes(idNode, idDimension) ON DELETE CASCADE ON UPDATE CASCADE;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM