Mysql

MySQL 數據庫的 XML 轉儲不包含外鍵約束。可能是什麼原因?sqldump(.sql) 文件列出它

  • February 25, 2014

我正在以 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;

有人知道他們為什麼不列出父表資訊嗎?以及,我們如何獲得外鍵約束的細節?

PS:儲存引擎是 InnoDB。

這是mysqldumpOracle 將其描述為“功能請求”的錯誤。

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從伺服器獲取數據的方式如此不同,因此將這些資訊添加到 XML 轉儲中並不是一個微不足道的改變。

沒有一個簡單的解決方法,儘管如錯誤報告中所述,該資訊是可用的,如果您提供選項information_schema,您可以從中訪問它(不允許鎖定 information_schema)。您必須獲取您檢索的數據,解析和提取相關位,並根據需要重新格式化它,然後它才會變得如此有用。mysqldump``--skip-lock-tables

引用自:https://dba.stackexchange.com/questions/59609