SymmetricDS を使用して同期されるはずのデータベースがあります。ベースを構築する次のクエリがあります。
CREATE TABLE `defectstdreference` (
`std_doc_id` bigint(20) NOT NULL COMMENT 'Идентификатор НТД',
`improve_notice_doc_id` bigint(20) NOT NULL COMMENT 'Идентификатор предписания',
`defect_id` int(11) NOT NULL COMMENT 'Идентификатор дефекта',
`paragraph` varchar(4000) NOT NULL COMMENT 'Пункт НТД',
`reference_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор ссылки на пункт НТД',
`client_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`reference_id`),
KEY `Relationship70` (`std_doc_id`),
KEY `Relationship72` (`improve_notice_doc_id`,`defect_id`,`client_id`),
CONSTRAINT `Relationship70` FOREIGN KEY (`std_doc_id`) REFERENCES `std` (`doc_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `Relationship72` FOREIGN KEY (`improve_notice_doc_id`, `defect_id`, `client_id`) REFERENCES `improvementnoticedefect` (`doc_id`, `defect_id`, `client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='Ссылки на НТД выявленных нарушений';
および参照されるテーブル:
CREATE TABLE `improvementnoticedefect` (
`description` varchar(20000) NOT NULL COMMENT 'Описание нарушения',
`defect_id` int(11) NOT NULL COMMENT 'Номер нарушения в рамках предписания',
`doc_id` bigint(20) NOT NULL COMMENT 'Номер документа "Предписание"',
`client_id` bigint(20) NOT NULL,
PRIMARY KEY (`doc_id`,`defect_id`,`client_id`),
KEY `Relationship68` (`doc_id`,`client_id`),
CONSTRAINT `Relationship68` FOREIGN KEY (`doc_id`, `client_id`) REFERENCES `improvementnotice` (`doc_id`, `client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Дефект';
ご覧のとおり、テーブルの主キーimpovementnoticedefect
と fk 制約 72 の列の順序defectstdreference
は同じです。
それでも、同期が開始されると、SymmetricDS で次のエラーが表示されます。
Cannot add foreign key constraint. Failed to execute: ALTER TABLE `defectstdreference`
ADD CONSTRAINT `Relationship72` FOREIGN KEY (`improve_notice_doc_id`, `defect_id`, `client_id`) REFERENCES `improvementnoticedefect` (`doc_id`, `defect_id`, `client_id`)
SymmetricDS が作成したテーブルの sql をダンプしようとすると、次のようになります。
CREATE TABLE `improvementnoticedefect` (
`defect_id` int(11) NOT NULL,
`doc_id` bigint(20) NOT NULL,
`client_id` bigint(20) NOT NULL,
`description` varchar(20000) NOT NULL,
PRIMARY KEY (`defect_id`,`doc_id`,`client_id`),
KEY `Relationship68` (`doc_id`,`client_id`),
CONSTRAINT `Relationship68` FOREIGN KEY (`doc_id`, `client_id`) REFERENCES `improvementnotice` (`doc_id`, `client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ご覧のとおり、主キーのフィールドの順序が異なります。
誤ったクエリを手動で実行してみましたが、エラーが発生しましたが、フィールドの順序を変更したところ、すべて問題ありませんでした。
どうすればこれを修正できますか? 私がしなければならない設定はありますか?私はここで本当に必死です、誰か助けてくれますか?
更新 SymmetricDS が XML を使用してテーブルを送信し、PK が XML から作成されることが問題であることに気付きました。
<!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database">
<database name="dataextractor">
<table name="improvementnoticedefect">
<column name="defect_id" primaryKey="true" required="true" type="INTEGER" size="10">
<platform-column name="mysql" type="INT" size="10"/>
</column>
<column name="doc_id" primaryKey="true" required="true" type="BIGINT" size="19">
<platform-column name="mysql" type="BIGINT" size="19"/>
</column>
<column name="client_id" primaryKey="true" required="true" type="BIGINT" size="19">
<platform-column name="mysql" type="BIGINT" size="19"/>
</column>
<column name="description" required="true" type="VARCHAR" size="20000">
<platform-column name="mysql" type="VARCHAR" size="20000"/>
</column>
<foreign-key name="Relationship68" foreignTable="improvementnotice">
<reference local="doc_id" foreign="doc_id"/>
<reference local="client_id" foreign="client_id"/>
</foreign-key>
</table>
</database>
そして、この XML 主キーから、作成された列の順序で生成されることがわかりますが、これは実際には間違っています。