2

データベースを MySQL 5 から SQL Server 2008 に移行しています。SQL Server Migration Assistant を使用していますが、理解できないエラーが表示されます。

次のようなテーブルがあります。

Table A
  ID (primary key)
  ProductionBatch
  Manufacturer
  LotNo
  Cost
  (and a bunch of other fields)

Table B
  ProductionBatch (primary key)
  Manufacturer (primary key)
  LotNo (primary key)
  Cost (primary key)
  (and a bunch of other fields)

MySQL では、両方のテーブルで示した 4 つのフィールドが、テーブル B の主キーとテーブル A の外部キーを形成します。テーブル A のフィールドに一致するものがない限り、テーブル B に新しいレコードを挿入したくありません。

M2SS0048: Foreign Key does not contains all the columns of Primary/Unique Key

文法エラーは別として、このエラーの意味がわかりません。テーブル A のフィールドに null 値を許可しているということですか? それとも、テーブル A で一意である必要はありませんか? テーブル B の主キーとして (複合キーの代わりに) 自動インクリメント整数を使用しようとしましたが、それは役に立たなかったようです。

アイデアや提案をいただければ幸いです。

編集: 明確にするために、私の外部キーはテーブル B にあります。最初にテーブル A にレコードを入れ、次にテーブル B にレコードを入れます。しかし、テーブル A のいずれにも一致しないレコードをテーブル B に入れたくありません。 .

2 番目の編集: この問題のコードを表示するように求められました。質問者に言ったように、私は簡単な例を使って質問しています。私の表は実際にはもっと複雑で、簡略化されたバージョンの方が答えやすいと思いました。しかし、私が実際に何をしているかを見たい人のために、ここに実際の表があります。リンクしている実際のフィールドは、QCBatchID、LaboratoryName、Constituent、Fraction です (上記の例では一般的なものを使用しました)。

表 A は次のとおりです。

CREATE TABLE `chemistry_qc` (
`QCBatchID` varchar(12) COLLATE utf8_unicode_ci NOT NULL,
`LaboratoryName` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`Constituent` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`Fraction` enum('Not Reported','NA','Total','Dissolved','TR') COLLATE utf8_unicode_ci    
NOT NULL,
`LabSampleType` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`PercentRecovery` decimal(5,2) DEFAULT NULL,
`RPD` double(5,2) DEFAULT NULL,
PRIMARY KEY (`QCBatchID`,`LaboratoryName`,`Constituent`,`Fraction`),
CONSTRAINT `fk_chem_qc_chem` FOREIGN KEY (`QCBatchID`, `LaboratoryName`,   `Constituent`, `Fraction`) REFERENCES `chemistry` (`LaboratoryName`, `QCBatchID`, `Constituent`, `Fraction`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

表 B は次のとおりです。

CREATE TABLE `chemistry` (
`ChemistryID` int(11) NOT NULL AUTO_INCREMENT,
`StationID` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
`EventStartDateTime` datetime NOT NULL,
`SampleStartDateTime` datetime DEFAULT NULL,
`SampleEndDateTime` datetime DEFAULT NULL,
`SampleType` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`FieldSampleID` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`Matrix` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`FieldQC` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`GrabComposite` enum('C','G') COLLATE utf8_unicode_ci DEFAULT NULL,
`EventRepresentation` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`CollectionMethod` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`LaboratoryName` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`LabSampleID` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`ConstituentType` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`Constituent` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`CASNumber` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`Fraction` enum('TR','Dissolved','Total','Not Reported','NA') COLLATE utf8_unicode_ci   DEFAULT NULL,
`QCBatchID` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`SamplePrepMethod` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`AnalysisType` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
`LabSampleType` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL,
`AnalyteType` varchar(5) COLLATE utf8_unicode_ci DEFAULT NULL,
`SamplePrepDate` date DEFAULT NULL,
`ReportedValue` double DEFAULT NULL,
`Units` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`NumericQualifier` enum('>=','<=','>','<','=') COLLATE utf8_unicode_ci DEFAULT NULL,
`DataQualifier` text COLLATE utf8_unicode_ci,
`ReportingLimit` double DEFAULT NULL,
`MethodDetectionLimit` double DEFAULT NULL,
`PercentMoisture` decimal(3,2) DEFAULT NULL,
`MethodReference` varchar(12) COLLATE utf8_unicode_ci DEFAULT NULL,
`MethodNumber` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`AnalysisDateTime` datetime DEFAULT NULL,
`Dilution` int(3) DEFAULT NULL,
`SampleNotes` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`ChemistryID`),
KEY `fk_chemistry_event1` (`StationID`,`EventStartDateTime`),
KEY `fk_chemistry_laboratory1` (`LaboratoryName`),
KEY `ChemistryID` (`ChemistryID`,`StationID`,`EventStartDateTime`),
KEY `fk_chemistry_c_EventRepresentation1` (`EventRepresentation`),
KEY `fk_chemistry_c_collectionmethod1` (`CollectionMethod`),
KEY `fk_chemistry_c_sampletype1` (`SampleType`),
KEY `fk_chemistry_c_matrix` (`Matrix`),
KEY `fk_chemistry_c_methods`      (`Constituent`,`ConstituentType`,`Units`,`MethodReference`,`MethodNumber`),
KEY `fk_chemistry_sampleprepmethod1` (`SamplePrepMethod`),
KEY `fk_chemistry_analysistype` (`AnalysisType`),
KEY `fk_chemistry_analytetype` (`AnalyteType`),
KEY `fk_chemistry_labsampletype` (`LabSampleType`),
KEY `ChemistryID_2` (`ChemistryID`,`StationID`),
KEY `LaboratoryName` (`LaboratoryName`,`Constituent`,`Fraction`,`QCBatchID`),
KEY `QCBatchID_4` (`QCBatchID`,`LaboratoryName`,`Constituent`,`Fraction`),
KEY `LaboratoryName_4` (`LaboratoryName`,`QCBatchID`,`Constituent`,`Fraction`),
CONSTRAINT `chemistry_analysistype` FOREIGN KEY (`AnalysisType`) REFERENCES   `c_analysistype` (`AnalysisType`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_10` FOREIGN KEY (`SamplePrepMethod`) REFERENCES `c_sampleprepmethod` (`SamplePrepMethod`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_11` FOREIGN KEY (`Constituent`, `ConstituentType`, `Units`, `MethodReference`, `MethodNumber`) REFERENCES `c_methods` (`Constituent`, `ConstituentType`, `Units`, `MethodReference`, `MethodNumber`) ON DELETE NO ACTION ON   UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_2` FOREIGN KEY (`AnalyteType`) REFERENCES `c_analytetype` (`AnalyteType`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_3` FOREIGN KEY (`CollectionMethod`) REFERENCES `c_collectionmethod` (`CollectionMethod`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_4` FOREIGN KEY (`EventRepresentation`) REFERENCES `c_eventrepresentation` (`EventRepresentation`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_5` FOREIGN KEY (`Matrix`) REFERENCES `c_matrix` (`Matrix`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_6` FOREIGN KEY (`SampleType`) REFERENCES `c_sampletype` (`SampleType`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_7` FOREIGN KEY (`StationID`, `EventStartDateTime`)   REFERENCES `event` (`StationID`, `EventStartDateTime`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_8` FOREIGN KEY (`LaboratoryName`) REFERENCES `laboratory` (`LaboratoryName`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `chemistry_ibfk_9` FOREIGN KEY (`LabSampleType`) REFERENCES `c_labsampletype` (`LabSampleType`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=InnoDB AUTO_INCREMENT=206971 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  
4

2 に答える 2

2

エラー自体は、テーブル B の PK を構成する 4 つの列すべてが FK に含まれていないことを示しているだけです。FK の仕様を再確認し、4 つすべてが含まれているかどうかを確認してください。

そうは言っても、@Kevin のコメント (質問) は正しいです。FK はそのようには機能しません。最初に PK テーブルに挿入する必要があります。

編集:FKがAではなくテーブルBにあることがわかりました(コメントと編集によると)これが問題です.Aを参照するテーブルBにFKがありますが、AのPKは単なるIDです...これテーブル B の FK とそれが参照しているテーブル (この場合は A) の PK は同じである必要があります。ID 列を A から PK として削除し、そのキーを B と同じ複合キーにすることができます。

于 2012-06-22T17:20:15.893 に答える
1

2 つのテーブルから関連する列のみを保持します。

表 A:

CREATE TABLE chemistry_qc (
  QCBatchID       varchar(12) COLLATE utf8_unicode_ci  NOT NULL,
  LaboratoryName  varchar(45) COLLATE utf8_unicode_ci  NOT NULL,
  Constituent     varchar(45) COLLATE utf8_unicode_ci  NOT NULL,
  Fraction        enum('Not Reported','NA','Total','Dissolved','TR') 
                              COLLATE utf8_unicode_ci  NOT NULL,
  --- more columns

  PRIMARY KEY (QCBatchID, LaboratoryName, Constituent, Fraction),

  CONSTRAINT fk_chem_qc_chem 
    FOREIGN KEY (QCBatchID, LaboratoryName, Constituent, Fraction) 
      REFERENCES chemistry 
                (LaboratoryName, QCBatchID, Constituent, Fraction) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION

) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8 
  COLLATE=utf8_unicode_ci ;

表 B:

CREATE TABLE chemistry (
  ChemistryID     int(11) NOT NULL AUTO_INCREMENT,
  --- more columns
  LaboratoryName  varchar(45) COLLATE utf8_unicode_ci  DEFAULT NULL,
  --- more columns
  Constituent     varchar(45) COLLATE utf8_unicode_ci  DEFAULT NULL,
  Fraction        enum('TR','Dissolved','Total','Not Reported','NA') 
                             COLLATE utf8_unicode_ci  DEFAULT NULL,
  QCBatchID       varchar(12) COLLATE utf8_unicode_ci  DEFAULT NULL,
  --- more columns

PRIMARY KEY (ChemistryID),

KEY fk_chemistry_laboratory1 (LaboratoryName),
--- more KEYs
KEY LaboratoryName (LaboratoryName, Constituent, Fraction, QCBatchID),
KEY QCBatchID_4 (QCBatchID, LaboratoryName, Constituent, Fraction),
      --- this key should have been needed for your FK reference

KEY LaboratoryName_4 (LaboratoryName , QCBatchID, Constituent, Fraction),
      --- this key was needed for your FK reference

--- CONSTRAINTS 

) ENGINE=InnoDB 
  AUTO_INCREMENT=206971 
  DEFAULT CHARSET=utf8 
  COLLATE=utf8_unicode_ci ; 

記録のために、これはFOREIGN KEYテーブルからテーブルA (chemistry_qc)B (chemistry)


FOREIGN KEY制約には 2 つのエラーがあります。1 つ目はあなたによって行われました (そして MySQL によって支援されました)。2 つの参照と参照される複合キーの順序が異なります。

CONSTRAINT fk_chem_qc_chem 
    FOREIGN KEY (QCBatchID, LaboratoryName, Constituent, Fraction) 
      REFERENCES chemistry 
                (LaboratoryName, QCBatchID, Constituent, Fraction) 
             ---    |||             |||   
             --- *** wrong order here *** ---

そのはず:

CONSTRAINT fk_chem_qc_chem 
    FOREIGN KEY (QCBatchID, LaboratoryName, Constituent, Fraction) 
      REFERENCES chemistry 
                (QCBatchID, LaboratoryName, Constituent, Fraction) 

VARCHAR(45)a が aを参照している場所に FK を追加しようとすると、MySQL は文句を言うべきでしたVARCHAR(12)が、そうではありませんでした。


2 番目のエラーは、FK がどちらPRIMARYでもないキーを参照していることUNIQUEです。一意でない列複合への FK を許可することで物事を台無しにする MySQL による別の支援。

そのため、(case-1) そのキーをUNIQUEテーブルのように宣言するchemistryか、(case-2) FK を逆に、from table Bto A(既にPRIMARY KEYこのコンパウンドにある) にする必要があります。

どちらが正しいかは、データの関係によって異なります。

every にchemistryは 0 または 1 がありchemistry_qcますか? それがケース 1 です (そして、1:1関係があるか、より正確には a0..1 :: 1です)。

すべてのchemistry_qcは 0 以上chemistryですか? それがケース 2 です (そして、上記の表記のaという共通の1:n関係があります)。1 :: 0..n


最後に、移行エラーの原因は、使用したウィザードが (正しく)または化合物FOREIGN KEYを参照する制約を想定していたことであることが明らかです。PRIMARYUNIQUE

于 2012-06-22T22:49:04.623 に答える