データベースのスキーマ情報にXML形式でアクセスしています。以下のコマンドを使用して、XML形式でデータベースのダンプを取得しています。
mysqldump --no-data --xml -u root -p bakerydb> bakerydb.xml
これらのダンプは、外部キー制約をリストしません。出力の以下の部分がリストされています。
<table_structure name="class_details">
<field Field="id" Type="int(10)" Null="NO" Key="PRI" Extra="auto_increment" Comment="" />
<field Field="course_id" Type="int(10)" Null="NO" Key="MUL" Extra="" Comment="" />
<field Field="start_date" Type="date" Null="NO" Key="" Extra="" Comment="" />
<field Field="end_date" Type="date" Null="NO" Key="" Extra="" Comment="" />
<field Field="tutor_id" Type="int(10)" Null="NO" Key="MUL" Extra="" Comment="" />
<key Table="class_details" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="id" Collation="A" Cardinality="0" Null="" Index_type="BTREE" Comment="" Index_comment="" />
<key Table="class_details" Non_unique="1" Key_name="fk_cources_offered_class_details" Seq_in_index="1" Column_name="course_id" Collation="A" Cardinality="0" Null="" Index_type="BTREE" Comment="" Index_comment="" />
<key Table="class_details" Non_unique="1" Key_name="fk_employee_details_class_details" Seq_in_index="1" Column_name="tutor_id" Collation="A" Cardinality="0" Null="" Index_type="BTREE" Comment="" Index_comment="" />
<options Name="class_details" Engine="InnoDB" Version="10" Row_format="Compact" Rows="0" Avg_row_length="0" Data_length="16384" Max_data_length="0" Index_length="32768" Data_free="7340032" Auto_increment="1" Create_time="2014-02-25 07:08:56" Collation="utf8_general_ci" Create_options="" Comment="" />
</table_structure>
同じデータベースに、sqldumpの詳細な外部キー制約がリストされています。 (.sqlファイル)。以下に記載されています。
DROP TABLE IF EXISTS `class_details`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `class_details` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`course_id` int(10) NOT NULL,
`start_date` date NOT NULL,
`end_date` date NOT NULL,
`tutor_id` int(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_cources_offered_class_details` (`course_id`),
KEY `fk_employee_details_class_details` (`tutor_id`),
CONSTRAINT `fk_employee_details_class_details` FOREIGN KEY (`tutor_id`) REFERENCES `employee_details` (`emp_id`),
CONSTRAINT `fk_courses_offered_class_details` FOREIGN KEY (`course_id`) REFERENCES `courses_offered` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
親テーブル情報をリストしない理由を知っている人はいますか?そしてその方法、外部キー制約の詳細をどのように取得できますか?
追記:ストレージエンジンはInnoDBです。
これは、Oracleが「機能要求」として特徴付けたmysqldump
のバグです。
http://bugs.mysql.com/bug.php?id=66821
通常モード(XMLではない)では、mysqldump
はSHOW CREATE TABLE tablename
からのサーバーの出力を使用するだけです。
if (!opt_xml ...
...
my_snprintf(buff, sizeof(buff), "show create table %s", result_table);
--xml
モードで実行している場合、mysqldump
はSHOW KEYS FROM 'tablename'
からの出力を使用しますが、これには外部キー制約は含まれていません。
my_snprintf(buff, sizeof(buff), "show keys from %s", result_table);
mysqldump
の2つの異なる動作モードは、このように異なる方法でサーバーからデータをフェッチするため、この情報をXMLダンプに追加することは簡単な変更ではありません。
簡単な回避策はありませんが、バグレポートに記載されているように、情報はinformation_schema
で入手でき、--skip-lock-tables
オプション(locking information_schema)を指定すると、mysqldump
からアクセスできます。許可されていません)。取得したデータを取得し、関連するビットを解析および抽出し、必要に応じて再フォーマットしてからでないと、すべての有用性が失われます。