web-dev-qa-db-ja.com

MySQLデータベースのXMLダンプには、外部キー制約は含まれていません。理由は何ですか? sqldump(.sql)ファイルリスト

データベースのスキーマ情報に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です。

1
Nikunj Shukla

これは、Oracleが「機能要求」として特徴付けたmysqldumpのバグです。

http://bugs.mysql.com/bug.php?id=66821

通常モード(XMLではない)では、mysqldumpSHOW CREATE TABLE tablenameからのサーバーの出力を使用するだけです。

if (!opt_xml ...
    ...
    my_snprintf(buff, sizeof(buff), "show create table %s", result_table);

--xmlモードで実行している場合、mysqldumpSHOW 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からアクセスできます。許可されていません)。取得したデータを取得し、関連するビットを解析および抽出し、必要に応じて再フォーマットしてからでないと、すべての有用性が失われます。

0