sql >> データベース >  >> RDS >> Mysql

3番目のテーブルのFK制約の違反を防ぐための制約

    あなたのsolIdを見つけました solitications用でした 。私はもともとそれが(岩のように)しっかりしていることを意味すると思っていました。ですから、これは作曲を通して行うことができます。

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

    同様に、次のスキーマは、提供されたテーブルが欠落しているために失敗します。これは、約60〜70パーセントです。

    これまでの表:

    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つの親があります(BaseRFQId およびSolId )、および1つの子(NSNId )。 IDとしての名前または識別子 、はbaserfqssolsのFKターゲットです サポートする行。 参照 および参照 それぞれ。

    同様に、compTableX002 質問2の条件を解決しているようです。

    クリーンアップ:

    drop schema slipper;
    



    1. mysqlを使用してlat/longがポリゴン内にあるかどうかを確認します

    2. MySqlビューは非常に遅いです。なんで?

    3. PostgreSQLを使用してすべてのデータベースを一覧表示する方法

    4. MySQL正規表現クエリの大文字と小文字を区別しない