2016-07-12 11 views
3

私はストアドプロシージャで必要な制約を実装できますが、ジョブを実行する外部キー制約のセットを定義できるかどうかは疑問です。3番目のテーブルのFK制約違反を防ぐための制約

私はこれらのキーの関係で、複数のテーブルを持っている:私の質問はあり

NSNs 
--- 
Id PK 

Solicitations 
---- 
Id   PK 
NSNId   FK - NSNs 

Parts 
----- 
Id  PK 
NSNId  FK - NSNs 

BaseRFQs 
------- 
Id  PK 
NSNId FK - NSNs 

RFQs 
---- 
Id   PK 
BaseRFQId FK - BaseRFQs 

BaseRFQsSols 
------------ 
BaseRFQId PK/FK - BaseRFQs 
SolId  PK/FK - Solicitations 

RFQsSolsParts 
------------- 
RFQId  PK/FK - RFQs 
SolId  PK/FK - Solicitations 
PartId PK/FK - Parts 

  1. はBaseRFQIdとの両方を必要BaseRFQsSols上の外部キー制約を設定することは可能ですSolIdは、同じNSNIdを持つレコードを参照しますか?
  2. SolIdとPartIdが同じNSNIdを持つレコードを参照するように要求するRFQsSolsPartsに外部キー制約を設定することは可能ですか?には、他の2つと同じNSNIdを持つBaseRFQIdを参照するためにRFQIdが必要ですか?私は(私が間違って理解していれば、私を修正してください)それを理解するよう私が求めているCONSTRAINT FOREIGN KEY構文はANSI準拠ですが、解決策のoughtn'tはとの間で変化することがので、私は、MySQLを使用してい

DBMS実装。

EDITは:彼らが今立つようドリューの要求@ごとに、ここでのテーブル定義は、以下のとおりです。

CREATE TABLE `nsns` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSN` char(16) NOT NULL, 
    `Description` varchar(100) DEFAULT NULL, 
    `ShortDesc` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `NSN_UNIQUE` (`NSN`) 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin7 

CREATE TABLE `solicitations` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '0', 
    `SolicitationNo` char(16) NOT NULL, 
    `Quantity` int(11) NOT NULL, 
    `ReturnByDate` date NOT NULL, 
    `StatusId` int(11) NOT NULL DEFAULT '1', 
    `Memo` text, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `SolicitationNo_UNIQUE` (`SolicitationNo`), 
    KEY `NSN_idx` (`NSNId`) 
    CONSTRAINT `NSNId` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin7 

CREATE TABLE `parts` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `VendorId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '1', 
    `StatusId` int(11) DEFAULT '1', 
    `PartNo` varchar(45) DEFAULT NULL, 
    `Memo` text, 
    PRIMARY KEY (`ID`) 
    KEY `NSN_idx` (`NSNId`) 
    CONSTRAINT `NSNId` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin7 

CREATE TABLE `baserfqs` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `BRFQNo` varchar(45) DEFAULT NULL, 
    `Memo` text, 
    `Finalized` bit(1) NOT NULL DEFAULT b'0', 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `BRFQNo_UNIQUE` (`BRFQNo`), 
    KEY `NSN_idx` (`NSNId`), 
    CONSTRAINT `NSNId` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin7 

CREATE TABLE `rfqs` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `BaseRFQId` int(11) NOT NULL, 
    `VendorId` int(11) NOT NULL, 
    `RFQNo` varchar(45) NOT NULL, 
    `StatusId` int(11) NOT NULL DEFAULT '6', 
    `DateSent` date DEFAULT NULL, 
    `DateResponded` date DEFAULT NULL, 
    `VendorNotes` text, 
    `QuotedBy` varchar(45) DEFAULT NULL, 
    `Title` varchar(45) DEFAULT NULL, 
    `ValidityCodeId` int(11) DEFAULT '4', 
    `UnitWt` decimal(10,3) DEFAULT NULL, 
    `WtUOMId` int(11) DEFAULT '1', 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `RFQNo_UNIQUE` (`RFQNo`), 
    KEY `BaseRFQId_idx` (`BaseRFQId`), 
    KEY `VendorId_idx` (`VendorId`), 
    KEY `StatusId_idx` (`StatusId`), 
    KEY `ValidityCodeId_idx` (`ValidityCodeId`), 
    KEY `WtUOMId_idx` (`WtUOMId`), 
    CONSTRAINT `WtUOMId` FOREIGN KEY (`WtUOMId`) REFERENCES `wtuoms` (`ID`), 
    CONSTRAINT `BaseRFQId` FOREIGN KEY (`BaseRFQId`) REFERENCES `baserfqs` (`ID`), 
    CONSTRAINT `StatusId` FOREIGN KEY (`StatusId`) REFERENCES `rfqstatus` (`ID`), 
    CONSTRAINT `ValidityCodeId` FOREIGN KEY (`ValidityCodeId`) REFERENCES `validitycodes` (`ID`), 
    CONSTRAINT `VendorId` FOREIGN KEY (`VendorId`) REFERENCES `vendors` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin7 

CREATE TABLE `baserfqssols` (
    `BaseRFQId` int(11) NOT NULL, 
    `SolId` int(11) NOT NULL, 
    `LineItemNo` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`BaseRFQId`,`SolId`), 
    KEY `RFQ_idx` (`BaseRFQId`), 
    KEY `Solicitation_idx` (`SolId`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin7 

CREATE TABLE `rfqssolsparts` (
    `RFQId` int(11) NOT NULL, 
    `SolId` int(11) NOT NULL, 
    `PartId` int(11) NOT NULL, 
    `CondId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '1', 
    `UnitPrice` decimal(10,3) NOT NULL, 
    `LeadTime` int(11) DEFAULT NULL, 
    `LTCId` int(11) DEFAULT NULL, 
    `SplsNSNId` int(11) DEFAULT NULL, 
    `SetupCostInc` bit(1) NOT NULL DEFAULT b'0', 
    `CertCostInc` bit(1) NOT NULL DEFAULT b'0', 
    `MfgCerts` bit(1) NOT NULL DEFAULT b'0', 
    `Altered` bit(1) NOT NULL DEFAULT b'0', 
    `OrigPkg` bit(1) NOT NULL DEFAULT b'1', 
    `SplsContNo` varchar(45) DEFAULT NULL, 
    `SplsDate` date DEFAULT NULL, 
    PRIMARY KEY (`RFQId`,`SolId`,`PartId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin7 
+0

なぜ各XYZ用のテーブルxyz'を作成 'ショーを公開しません。私たちの何人かは次の質問にちょうど向かいます。 – Drew

+0

ありがとう@Drew。私はそれをします。私は過度に複雑にしたくなかった... – BobRodes

+0

私はあなたが宣言的にしたいことはできないとは言わないが、どうして描けないのか分からない。それは私のプロジェクトだったので、私はFK制約を可能な限り宣言して、トリガーを使用して検証の最後のステップを行うことになるでしょう。 –

答えて

2

私はあなたのsolIdsoliticationsのためだった考え出し。私はもともとそれが固い(岩のような)ことを意味すると考えました。ですから、これは作曲を通して行うことができます。

提供されているスキーマにいくつかのタイプミスがあったことに注意してください。いくつかのカンマがありません。いくつかはインデックス名を欺いています。 MyISAMテーブルがINNODBに変更されました。だから私はいくつかの名前を変更しました。また、table5の周りに欠けているテーブルがありました。したがって、あなたのスクリプトが実行されるようにはなりません(テーブルrfqs)。

同様に、提供されているテーブルが不足しているため、次のスキーマは失敗します。

の表は、これまで:

create schema slipper; 
use slipper; 

CREATE TABLE `nsns` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSN` char(16) NOT NULL, 
    `Description` varchar(100) DEFAULT NULL, 
    `ShortDesc` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `NSN_UNIQUE` (`NSN`) 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin7; 

drop table if exists `solicitations`; 
CREATE TABLE `solicitations` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '0', 
    `SolicitationNo` char(16) NOT NULL, 
    `Quantity` int(11) NOT NULL, 
    `ReturnByDate` date NOT NULL, 
    `StatusId` int(11) NOT NULL DEFAULT '1', 
    `Memo` text, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `SolicitationNo_UNIQUE` (`SolicitationNo`), 
    KEY `NSN_idx1111` (`NSNId`), 
    KEY `NSN_idx1112` (`ID`,`NSNId`), -- atm an necessary evil. Revisit, perhaps collapse one 
    CONSTRAINT `NSNId` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin7; 

drop table if exists `parts`; 
CREATE TABLE `parts` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `VendorId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '1', 
    `StatusId` int(11) DEFAULT '1', 
    `PartNo` varchar(45) DEFAULT NULL, 
    `Memo` text, 
    PRIMARY KEY (`ID`), 
    KEY `NSN_idx2222` (`NSNId`), 
    KEY `NSN_idx2223` (`ID`,`NSNId`), -- atm an necessary evil. Revisit, perhaps collapse one 
    CONSTRAINT `NSNId2222` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin7; 

drop table if exists `baserfqs`; 
CREATE TABLE `baserfqs` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `NSNId` int(11) NOT NULL, 
    `BRFQNo` varchar(45) DEFAULT NULL, 
    `Memo` text, 
    `Finalized` bit(1) NOT NULL DEFAULT b'0', 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `BRFQNo_UNIQUE` (`BRFQNo`), 
    KEY `NSN_idx4444` (`NSNId`), 
    KEY `NSN_idx4445` (`ID`,`NSNId`), -- atm an necessary evil. Revisit, perhaps collapse one 
    CONSTRAINT `NSNId4444` FOREIGN KEY (`NSNId`) REFERENCES `nsns` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin7; 

CREATE TABLE `rfqs` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `BaseRFQId` int(11) NOT NULL, 
    `VendorId` int(11) NOT NULL, 
    `RFQNo` varchar(45) NOT NULL, 
    `StatusId` int(11) NOT NULL DEFAULT '6', 
    `DateSent` date DEFAULT NULL, 
    `DateResponded` date DEFAULT NULL, 
    `VendorNotes` text, 
    `QuotedBy` varchar(45) DEFAULT NULL, 
    `Title` varchar(45) DEFAULT NULL, 
    `ValidityCodeId` int(11) DEFAULT '4', 
    `UnitWt` decimal(10,3) DEFAULT NULL, 
    `WtUOMId` int(11) DEFAULT '1', 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `RFQNo_UNIQUE` (`RFQNo`), 
    KEY `BaseRFQId_idx` (`BaseRFQId`), 
    KEY `VendorId_idx` (`VendorId`), 
    KEY `StatusId_idx` (`StatusId`), 
    KEY `ValidityCodeId_idx` (`ValidityCodeId`), 
    KEY `WtUOMId_idx` (`WtUOMId`), 
    CONSTRAINT `WtUOMId` FOREIGN KEY (`WtUOMId`) REFERENCES `wtuoms` (`ID`), 
    CONSTRAINT `BaseRFQId` FOREIGN KEY (`BaseRFQId`) REFERENCES `baserfqs` (`ID`), 
    CONSTRAINT `StatusId` FOREIGN KEY (`StatusId`) REFERENCES `rfqstatus` (`ID`), 
    CONSTRAINT `ValidityCodeId` FOREIGN KEY (`ValidityCodeId`) REFERENCES `validitycodes` (`ID`), 
    CONSTRAINT `VendorId` FOREIGN KEY (`VendorId`) REFERENCES `vendors` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin7; 


drop table if exists `compTableX001`; 
CREATE TABLE `compTableX001` 
( -- a composition table for FK's in `baserfqssols` 
    `ID` int(11) AUTO_INCREMENT PRIMARY KEY, 
    `BaseRFQId` int(11) NOT NULL,  -- baserfqs.ID 
    `SolId` int(11) NOT NULL,   -- solicitations.ID 
    `NSNId` int(11) NOT NULL, 
    unique key (`BaseRFQId`,`SolId`), -- no dupes allowed 
    CONSTRAINT `tx001_base` FOREIGN KEY (`BaseRFQId`,`NSNId`) REFERENCES `baserfqs` (`ID`,`NSNId`), 
    CONSTRAINT `tx001_sol` FOREIGN KEY (`SolId`,`NSNId`) REFERENCES `solicitations` (`ID`,`NSNId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin7; 

drop table if exists `compTableX002`; 
CREATE TABLE `compTableX002` 
( -- a composition table for FK's in `rfqssolsparts` 
    `ID` int(11) AUTO_INCREMENT PRIMARY KEY, 
    `BaseRFQId` int(11) NOT NULL,  -- baserfqs.ID 
    `SolId` int(11) NOT NULL,   -- solicitations.ID 
    `PartId` int(11) NOT NULL,  -- parts.ID 
    `NSNId` int(11) NOT NULL, 
    unique key (`BaseRFQId`,`SolId`,`PartId`), -- no dupes allowed 
    CONSTRAINT `tx002_base` FOREIGN KEY (`BaseRFQId`,`NSNId`) REFERENCES `baserfqs` (`ID`,`NSNId`), 
    CONSTRAINT `tx002_sol` FOREIGN KEY (`SolId`,`NSNId`) REFERENCES `solicitations` (`ID`,`NSNId`), 
    CONSTRAINT `tx002_part` FOREIGN KEY (`PartId`,`NSNId`) REFERENCES `parts` (`ID`,`NSNId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin7; 

drop table if exists `baserfqssols`; 
CREATE TABLE `baserfqssols` (
    `ID` int(11) auto_increment, 
    `compId` int(11) NOT NULL, -- composition ID `compTableX001`.`ID` 
    `LineItemNo` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`ID`), 
    CONSTRAINT `basesol_compX001` FOREIGN KEY (`compId`) REFERENCES `compTableX001` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin7; -- changed engine type 

-- Is it possible to set up a foreign key constraint on RFQsSolsParts that requires SolId and PartId to reference records 
-- that have the same NSNId, and requires RFQId to reference a BaseRFQId which has the same NSNId as the other two? 

drop table if exists `rfqssolsparts`; 
CREATE TABLE `rfqssolsparts` (
    -- `RFQId` int(11) NOT NULL,  -- requirement BBBBBBBBBBBBB 
    -- `SolId` int(11) NOT NULL,  -- requirement AAAAAAAAA 
    -- `PartId` int(11) NOT NULL,  -- requirement AAAAAAAAA 
    `ID` int(11) auto_increment, 
    `compId` int(11) NOT NULL, -- composition ID `compTableX002`.`ID` 
    `CondId` int(11) NOT NULL, 
    `UOMId` int(11) NOT NULL DEFAULT '1', 
    `QUPId` int(11) NOT NULL DEFAULT '1', 
    `UnitPrice` decimal(10,3) NOT NULL, 
    `LeadTime` int(11) DEFAULT NULL, 
    `LTCId` int(11) DEFAULT NULL, 
    `SplsNSNId` int(11) DEFAULT NULL, 
    `SetupCostInc` bit(1) NOT NULL DEFAULT b'0', 
    `CertCostInc` bit(1) NOT NULL DEFAULT b'0', 
    `MfgCerts` bit(1) NOT NULL DEFAULT b'0', 
    `Altered` bit(1) NOT NULL DEFAULT b'0', 
    `OrigPkg` bit(1) NOT NULL DEFAULT b'1', 
    `SplsContNo` varchar(45) DEFAULT NULL, 
    `SplsDate` date DEFAULT NULL, 
    -- PRIMARY KEY (`RFQId`,`SolId`,`PartId`) 
    PRIMARY KEY (`ID`), 
    CONSTRAINT `triplet_compX002` FOREIGN KEY (`compId`) REFERENCES `compTableX002` (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin7; 

compTableX001は名前IDとTwoParents-OneChildミニ階層のようなものです。だからIDは親の名前です。 2つの親(BaseRFQIdSolId)と1つの子(NSNId)があります。 IDという名前または識別子は、それがサポートするbaserfqssols行のFKターゲットです。 参照および参照をそれぞれ参照してください。

同様に、compTableX002質問2.

クリーンアップのために今の状態を解決するために表示されます。

drop schema slipper; 
+0

はい、ここでは、私が含まれていないいくつかのテーブル、短いルックアップテーブルなどがあります。私にこれを勉強させてください...そしてありがとう。 – BobRodes

+0

私は質問2に続きます – Drew

+0

いいえ、コンポジションテーブルは、必要なリファレンスをまとめてグルーピングするテーブルです。正しい? – BobRodes

関連する問題