1

制約として2番目のフィールドを使用してカスケードでフィールドを更新する方法について質問があります。

構造は次のとおりです(不要な列を削除しました):

nodesidNodeidDimension(一緒に主キーを形成する)テーブル。

列(PK)、forces(。への外部キー)および。idForceidNodenodesidNodeidDimension

すべてをカスケード更新および削除します。

表示されるように見えるこの構造の問題は次のとおりです。

(1、1)と(1、2)のnodesようなエントリがあり、(1、1、1)と(1、1、2)のようなエントリがあり、両方のエントリのforces最初のエントリを更新または削除すると、影響を受ける。nodesforces

対応する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;

私の制約は私が望むように機能していないので、それらを無視してください:)。

4

1 に答える 1

8

一意でないフィールドを参照する2つの奇妙な外部キー(forces_ibfk_1および)があります。forces_ibfk_2それらを削除します-

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

次にfk_forces_nodes1、CASCADEアクションオプションを使用して、フィールドの一意のペアを参照するものを再作成します-

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;
于 2012-08-08T10:13:51.290 に答える