【问题标题】:Update one table column data to another table column along with unique,duplicate check and update with suffix on duplicate将一个表列数据更新到另一个表列,同时进行唯一、重复检查并在重复时使用后缀进行更新
【发布时间】:2021-12-15 23:00:08
【问题描述】:

对于 4.9 到 5.6 等较低的 Mysql 版本需要这样做

我需要将一个表列数据复制到另一个表,但需要应用唯一检查,如果发现重复,则需要为数据添加后缀并继续更新。(不想因为重复数据而停止查询执行) .

让我澄清一下:

我的第一张桌子是tbl_categories:

cat_id  cat_parent_id   cat_active  cat_display_order   cat_suggested_hourly_rate
1       0               1           1                   10
2       1               1           2                   10

第二张桌子是tbl_categories_metadata:

cdata_cat_id    cdata_lang_id       cdata_name
1               1                   A
1               2                   B
1               3                   C
2               1                   A
2               2                   B
3               1                   D
3               2                   E
3               3                   F

所以在我的第二个表中添加的类别名称基于language id。

现在我需要在第一个表中添加一个名为 cat_identifier 的唯一列,所以我这样做了:

ALTER TABLE `tbl_categories` ADD `cat_identifier` VARCHAR(100) NOT NULL AFTER `cat_id`;

效果很好,现在我必须使其独一无二,但由于在运行上述查询时存在类似的值,因此无法直接完成,所以我做到了:

UPDATE
        `tbl_categories` a
    INNER JOIN `tbl_categories` b ON `a`.cat_id = `b`.cat_id
    SET
        `a`.cat_identifier = `b`.cat_id;
        

它工作正常,cat_id 添加到 cat_identifier 列,现在我可以通过以下查询使该列独一无二:

ALTER TABLE `tbl_categories`
      ADD UNIQUE KEY `cat_identifier` (`cat_identifier`);
      

工作正常,我的桌子现在看起来像这样:

cat_id  cat_identifier  cat_parent_id   cat_active  cat_display_order   cat_suggested_hourly_rate
1           1               0               1           1                   10
2           2               1               1           2                   10  

我被困在哪里:

我需要根据语言 ID 1 更新从 cdata_name 列中获取的 cat_identifier 值,但如果语言 ID 1 具有 2 个类别的相同数据,那么我需要添加 -cat_id 作为该数据的后缀需要更新

所以我尝试了以下查询:

UPDATE
`tbl_categories`
INNER JOIN `tbl_categories_metadata` ON `tbl_categories`.cat_id = `tbl_categories_metadata`.cdata_cat_id
SET
    `tbl_categories`.cat_identifier = `tbl_categories_metadata`.cdata_name
WHERE
    `tbl_categories_metadata`.cdata_lang_id = 1;
        
    

它正在工作,但立即发现语言 1 的重复项就停止了。

我想要的是如果发现重复,则添加 -cat_id(列的类别 ID)作为后缀并进行更新。比如clean-3,clean-4等等……

这样做的目的:有时管理员/前端卖家不会为类别添加特定语言的名称,有时他们会添加相同的名称,因此我们添加了cat_identifier这将是唯一的,独立于语言的并且必须添加。这个概念对于我们项目的新安装来说很简单,但是在已经工作的系统(我们项目的以前版本)中,我们必须以一种方式做到这一点,以使系统能够以最小的变化正常工作。

注意:查询以创建两个表以及数据

CREATE TABLE `tbl_categories` (
  `cat_id` int(11) UNSIGNED NOT NULL,
  `cat_identifier` varchar(100) NOT NULL,
  `cat_parent_id` int(11) UNSIGNED NOT NULL COMMENT '0 defaults to parent category',
  `cat_active` tinyint(4) UNSIGNED NOT NULL COMMENT '0 - Inactive, 1 - Active',
  `cat_display_order` decimal(4,2) NOT NULL,
  `cat_suggested_hourly_rate` decimal(10,2) NOT NULL COMMENT 'This will be used as suggestion hourly rate for this category.'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;


INSERT INTO `tbl_categories` (`cat_id`, `cat_identifier`, `cat_parent_id`, `cat_active`, `cat_display_order`, `cat_suggested_hourly_rate`) VALUES
(1, '', 0, 1, '1.00', '20.00'),
(2, '', 1, 1, '4.00', '15.00'),
(3, '', 1, 0, '3.00', '12.00'),
(4, '', 1, 1, '1.00', '18.00'),
(5, '', 1, 1, '2.00', '15.00'),
(6, '', 1, 1, '5.00', '10.00'),
(7, '', 0, 1, '2.00', '25.00'),
(8, '', 7, 1, '1.00', '20.00'),
(9, '', 7, 1, '2.00', '20.00'),
(10, '', 7, 1, '3.00', '20.00'),
(11, '', 0, 1, '3.00', '25.00'),
(12, '', 11, 1, '1.00', '20.00'),
(13, '', 11, 1, '2.00', '25.00'),
(14, '', 0, 1, '4.00', '20.00'),
(15, '', 14, 1, '1.00', '18.00'),
(16, '', 14, 1, '2.00', '25.00'),
(17, '', 0, 1, '5.00', '30.00'),
(18, '', 17, 1, '1.00', '0.00'),
(19, '', 17, 1, '2.00', '0.00'),
(20, '', 17, 1, '3.00', '0.00'),
(21, '', 0, 0, '2.00', '20.00'),
(22, '', 0, 0, '4.00', '25.00'),
(23, '', 0, 1, '5.00', '15.00'),
(24, '', 0, 0, '8.00', '22.00'),
(25, '', 0, 0, '9.00', '28.00'),
(26, '', 0, 1, '1.00', '20.00'),
(27, '', 26, 1, '1.00', '20.00'),
(28, '', 26, 1, '2.00', '45.00'),
(29, '', 26, 1, '3.00', '40.00'),
(30, '', 0, 0, '2.00', '15.00'),
(31, '', 0, 1, '3.00', '30.00'),
(32, '', 31, 1, '1.00', '22.00'),
(33, '', 31, 1, '2.00', '0.00'),
(34, '', 0, 0, '4.00', '15.00'),
(35, '', 0, 1, '5.00', '25.00'),
(36, '', 35, 1, '1.00', '25.00'),
(37, '', 35, 1, '2.00', '10.00'),
(38, '', 0, 0, '1.00', '40.00'),
(39, '', 0, 1, '3.00', '25.00'),
(40, '', 39, 1, '1.00', '22.00'),
(41, '', 39, 1, '2.00', '25.00'),
(42, '', 0, 0, '6.00', '35.00'),
(43, '', 0, 1, '7.00', '15.00'),
(44, '', 23, 1, '1.00', '22.00'),
(45, '', 23, 1, '2.00', '20.00'),
(46, '', 7, 1, '4.00', '25.00'),
(47, '', 43, 1, '1.00', '35.00'),
(48, '', 43, 1, '2.00', '18.00'),
(49, '', 43, 1, '3.00', '20.00'),
(50, '', 43, 1, '4.00', '40.00'),
(51, '', 7, 1, '5.00', '28.00'),
(52, '', 0, 1, '1.00', '10.00'),
(53, '', 0, 1, '1.00', '10.00');

ALTER TABLE `tbl_categories`
  ADD PRIMARY KEY (`cat_id`);

ALTER TABLE `tbl_categories`
  MODIFY `cat_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=54;


CREATE TABLE `tbl_categories_metadata` (
  `cdata_cat_id` int(11) UNSIGNED NOT NULL COMMENT 'ID of table tbl_categories',
  `cdata_lang_id` int(11) UNSIGNED NOT NULL,
  `cdata_name` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;


INSERT INTO `tbl_categories_metadata` (`cdata_cat_id`, `cdata_lang_id`, `cdata_name`) VALUES
(1, 3, 'Limpieza'),
(1, 2, 'Nettoyage'),
(1, 1, 'Cleaning'),
(2, 1, 'Bathroom Deep Cleaning'),
(2, 2, 'Nettoyage en profondeur de la salle de bain'),
(2, 3, 'Limpieza profunda de ba?'),
(3, 3, 'Limpieza de alfombras'),
(3, 2, 'Nettoyage de tapis'),
(3, 1, 'Carpet Cleaning'),
(4, 3, 'Limpieza profunda en el hogar'),
(4, 2, 'Nettoyage en profondeur'),
(4, 1, 'Home Deep Cleaning'),
(5, 1, 'Kitchen Deep Cleaning'),
(5, 2, 'Nettoyage en profondeur de la cuisine'),
(5, 3, 'Limpieza profunda de cocina'),
(6, 1, 'Car Cleaning'),
(6, 2, 'Nettoyage de voiture'),
(6, 3, 'Limpieza de coches'),
(7, 3, 'Experto'),
(7, 2, 'Qualifié'),
(7, 1, 'Skilled'),
(8, 1, 'Electricians'),
(8, 2, '?'),
(8, 3, 'Electricistas'),
(9, 1, 'Plumbers'),
(9, 2, 'Plombiers'),
(9, 3, 'Fontaneros'),
(10, 1, 'Carpenters'),
(10, 2, 'Charpentiers'),
(10, 3, 'Carpinteros'),
(11, 1, 'Fitness & Yoga'),
(11, 2, 'Fitness et yoga'),
(11, 3, 'Fitness y yoga'),
(12, 1, 'Fitness Trainer at Home'),
(12, 2, 'Fitness Trainer ?'),
(12, 3, 'Entrenador de fitness en casa'),
(13, 1, 'Yoga Trainer at Home'),
(13, 2, 'Formateur de yoga ?'),
(13, 3, 'Entrenador de yoga en casa'),
(14, 1, 'Salon at Home'),
(14, 2, 'Salon ?'),
(14, 3, 'Salon en casa'),
(15, 3, 'Salon en casa'),
(15, 2, 'Salon à domicile'),
(15, 1, 'Salon at home'),
(16, 1, 'Makeup and Hairstyling'),
(16, 2, 'Maquillage et Coiffure'),
(16, 3, 'Maquillaje y Peluquer?'),
(17, 3, 'Servicios de fotografia'),
(17, 2, 'Services de photographie'),
(17, 1, 'Photography Services'),
(18, 1, 'Wedding Photography & Filming'),
(18, 2, 'Photographie et tournage de mariage'),
(18, 3, 'Fotografía y filmación de bodas'),
(19, 3, 'Fotografía y rodaje de cumpleaños'),
(19, 2, 'Photographie et tournage d\'anniversaire'),
(19, 1, 'Birthday Photography & Filming'),
(20, 1, 'Family Function Shoots'),
(20, 2, 'Prise de vue en famille'),
(20, 3, 'Disparos de funciones familiares'),
(21, 3, 'Pintura mural'),
(21, 2, 'Peinture murale'),
(22, 2, 'Charpenterie'),
(22, 1, 'Carpentry'),
(23, 3, 'Personal de mantenimiento'),
(23, 2, 'Bricoleur'),
(23, 1, 'Handyman'),
(24, 3, 'Actividades de jardinería'),
(24, 2, 'Activités de jardinage'),
(24, 1, 'Gardening Activities'),
(25, 2, 'Déménagement d\'une maison complète / déménagement d\'une maison'),
(25, 3, 'Remoción de casa completa / mudanza de casa'),
(25, 1, 'Full House Removal / House moving'),
(26, 1, 'Performing Arts'),
(26, 2, 'Arts performants'),
(26, 3, 'Las artes escénicas'),
(27, 1, 'Party Host'),
(27, 2, 'Hôte de fête'),
(27, 3, 'Anfitrión de la fiesta'),
(28, 1, 'DJ'),
(28, 2, 'DJ'),
(28, 3, 'DJ'),
(29, 1, 'Choreographer'),
(29, 2, 'Chorégraphe'),
(29, 3, 'Coreógrafo'),
(30, 3, 'Mesas de barman / espera'),
(30, 2, 'Tables de barman / d\'attente'),
(30, 1, 'Bartending / Waiting Tables'),
(31, 2, 'Connectivité réseau'),
(31, 1, 'Network Connectivity'),
(31, 3, 'Conectividad de red'),
(32, 1, 'Broadband Connection installation'),
(32, 2, 'Installation de connexion à large bande'),
(32, 3, 'Instalación de conexión de banda ancha'),
(33, 1, 'Leased Line Connection'),
(33, 2, 'Connexion de ligne louée'),
(33, 3, 'Conexión de línea arrendada'),
(34, 3, 'Vigilancia de los niños'),
(34, 2, 'Baby-sitting'),
(34, 1, 'Baby Sitting'),
(35, 1, 'Pet Services'),
(35, 2, 'Services pour animaux'),
(35, 3, 'Servicios para mascotas'),
(36, 1, 'Pet Bathing & Grooming'),
(36, 2, 'Bain et toilettage d\'animaux'),
(36, 3, 'Baño y aseo de mascotas'),
(37, 1, 'Walking the pet'),
(37, 2, 'Promener l\'animal'),
(37, 3, 'Paseando a la mascota'),
(38, 2, 'Antiparasitaire'),
(39, 1, 'Personal Training'),
(39, 2, 'Formation personnelle'),
(39, 3, 'Entrenamiento personal'),
(40, 1, 'Voice Modulation / Speech'),
(40, 2, 'Modulation vocale / discours'),
(40, 3, 'Modulación de voz / habla'),
(41, 1, 'Personality Trainer'),
(41, 2, 'Entraîneur de personnalité'),
(41, 3, 'Entrenador de personalidad'),
(42, 3, 'Carta de presentación / Redactor'),
(42, 2, 'Lettre d\'accompagnement / Rédacteur de CV'),
(42, 1, 'Cover Letter / Resume Writer'),
(43, 3, 'Otros'),
(43, 2, 'Autres'),
(43, 1, 'Others'),
(21, 1, 'Wall Painting'),
(44, 1, 'Gardening Activities'),
(44, 2, 'Activités de jardinage'),
(44, 3, 'Actividades de jardinería'),
(45, 1, 'House moving'),
(45, 2, 'déménagement'),
(45, 3, 'mudanza'),
(22, 3, 'Carpintería'),
(46, 1, 'Carpentry'),
(46, 2, 'Charpenterie'),
(46, 3, 'Carpintería'),
(47, 1, 'Cover letter/Resume Writer'),
(47, 2, 'Lettre de motivation / Rédacteur de CV'),
(47, 3, 'Carta de presentación / Redactor'),
(48, 1, 'Baby Sitting'),
(48, 2, 'Baby-sitting'),
(48, 3, 'Vigilancia de los niños'),
(49, 1, 'Bartending/ Waiting Tables'),
(49, 2, 'Tables de barman / d\'attente'),
(49, 3, 'Mesas de barman / espera'),
(50, 1, 'Pest Control'),
(50, 2, 'Antiparasitaire'),
(50, 3, 'Control de plagas'),
(38, 1, 'Pest Control'),
(38, 3, 'Control de plagas'),
(51, 1, 'Wall Painting'),
(51, 2, 'Peinture murale'),
(51, 3, 'Pintura mural'),
(52, 1, 'Cat1'),
(53, 1, 'Cleaning');


ALTER TABLE `tbl_categories_metadata`
  ADD UNIQUE KEY `cat_id` (`cdata_cat_id`,`cdata_lang_id`);

【问题讨论】:

  • 有什么理由,既然你要这样做,你不能总是简单地附加cat_id?
  • 还有一个建议:考虑将表切换到InnoDB,因为它支持事务、外键、行级锁定,更能抵抗损坏并且通常与 MyISAM 一样快(如概述在“When to use MyISAM and InnoDB?”中)。
  • 您还需要向我们展示想要的结果。
  • @RickJames 我已经清楚地提到并描述了它。

标签: mysql


【解决方案1】:

一边

cat_identifier 和cat_id 含义相同,令人困惑。考虑到它的用途,新列的更合适的名称是default_name(或default_en_name)。此答案将使用前者。

回答

首先,按计划将列值设置为保证唯一值,同时使用tbl_categories_metadata.cdata_name 和tbl_categories.cat_id:

UPDATE `tbl_categories` AS tc
    JOIN `tbl_categories_metadata` AS tcm
      ON tc.cat_id = tcm.cdata_cat_id
  SET `default_name` = CONCAT(tcm.cdata_name, '-', tc.cat_id)
  WHERE
    tcm.cdata_lang_id = 1;

该列可以简单地保持原样。但是,如果您不想在某些字段上使用 cat_id,请将其删除。用于删除它的表达式取决于使用的 MySQL 服务器的版本(以及加载的 UDF)。如果使用 MySQL 8.0,请使用REGEXP_REPLACE

UPDATE IGNORE `tbl_categories`
  SET `default_name` = REGEXP_REPLACE(`default_name`, 
                         CONCAT('-', cat_id, '$'), 
                         '')
  ORDER BY cat_id

同样,如果您有一个添加正则表达式功能的 UDF,请使用它。如果使用 8.0 之前的版本,SUBSTRING() 和 CHAR_LENGTH() 的组合。

  ...
  SET `default_name` =  SUBSTRING(`default_name`, 1, 
                          CHAR_LENGTH(`default_name`) - 1 - CHAR_LENGTH(cat_id)
                        )
  ...

更简单(虽然更容易出错)的解决方案是使用REPLACE()

  ...
  SET `default_name` = REPLACE(`default_name`, 
                         CONCAT('-', cat_id), '')
  ...

备用答案

作为一个练习,它可以通过几种方式在单个查询中完成;这是一个系统的方法。

只要行可能依赖于其他行(例如具有唯一索引,但不仅如此),通常可以通过对其中一个表进行附加连接来完成单查询解决方案,通常是分组并使用聚合函数,尽管有时具有不相等的连接条件(例如,有时您可以使用类似tbl_alias_0.col < tbl_alias_1.col 的东西)。要获取相关行,连接通过tbl_categories_metadata。因此,表引用子句将是:

...
  `tbl_categories` AS tc
    JOIN `tbl_categories_metadata` AS tcm
      ON tc.cat_id = tcm.cdata_cat_id
    JOIN `tbl_categories_metadata` AS tcm_groups
      ON     tcm.cdata_name = tcm_groups.cdata_name 
         AND tcm.cdata_lang_id = tcm_groups.cdata_lang_id
...

(请注意,tcm 在此示例中仅用于连接,尽管在某些地方某些 tcm_groups 列引用可以替换为 tcm 列引用。)

对于本示例,由于每一行(由cat_id 或cdata_cat_id 标识)将被分配一个cdata_name,因此这些自然形成组。

...
GROUP BY tc.cat_id, tcm_groups.cdata_name
...

每个组中的cdata_name 可能来自tbl_categories 中的多行(通过cdata_cat_id)。由于组中只有来自tbl_categories 的一行不会在默认名称后附加后缀,因此必须指定此后缀。一个简单的选项是选择具有最小 cat_id 的行,但可以实施其他选项(例如最大 cat_id,随机)。这是通过CASE 实现的,使用与tcm_groups.cdata_cat_id 的比较来区分情况。

...
   CASE tc.cat_id
     WHEN MIN(tcm_groups.cdata_cat_id) THEN tcm.cdata_name
     ELSE CONCAT(tcm_groups.cdata_name, '-', tc.cat_id)
   END
...

如果这是一个简单的SELECT,那么上述组件就是您所需要的。 (以SELECT 开头有助于检查工作。)结合起来,它们是:

SELECT tc.cat_id, 
       CASE tc.cat_id
         WHEN MIN(tcm_groups.cdata_cat_id) THEN tcm_groups.cdata_name
         ELSE CONCAT(tcm_groups.cdata_name, '-', tc.cat_id)
       END AS default_name
  FROM `tbl_categories` AS tc
        JOIN `tbl_categories_metadata` AS tcm
          ON tc.cat_id = tcm.cdata_cat_id
        JOIN `tbl_categories_metadata` AS tcm_groups
          ON     tcm.cdata_name = tcm_groups.cdata_name 
             AND tcm.cdata_lang_id = tcm_groups.cdata_lang_id
  WHERE tcm_groups.cdata_lang_id = 1
  GROUP BY tc.cat_id, tcm_groups.cdata_name
  ORDER BY tc.cat_id

其中一个问题是GROUP BY 不允许出现在UPDATE 语句中。为了解决这个问题,连接表、分组和聚合函数需要在子SELECT 中进行。其中的组应该是 JOIN 条件中的列和分组子句中的任何列。聚合函数在结果列中使用。这给了子SELECT:

SELECT MIN(cdata_cat_id) AS cdata_cat_id, cdata_lang_id, cdata_name
  FROM `tbl_categories_metadata`
  GROUP BY cdata_name, cdata_lang_id
        

使用 that 重写表引用:

...
`tbl_categories` AS tc
    JOIN `tbl_categories_metadata` AS tcm
      ON tc.cat_id = tcm.cdata_cat_id
    JOIN (
        SELECT MIN(cdata_cat_id) AS cdata_cat_id, cdata_lang_id, cdata_name
          FROM `tbl_categories_metadata`
          GROUP BY cdata_name, cdata_lang_id
    ) AS tcm_groups
      ON     tcm.cdata_name = tcm_groups.cdata_name
         AND tcm.cdata_lang_id = tcm_groups.cdata_lang_id
...

聚合函数被替换为对 sub-SELECT 列的引用:

...
CASE tc.cat_id
  WHEN tcm_groups.cdata_cat_id THEN tcm_groups.cdata_name
  ELSE CONCAT(tcm_groups.cdata_name, '-', tc.cat_id)
END
...

这些部分可以组合成一个UPDATE:

UPDATE `tbl_categories` AS tc
    JOIN `tbl_categories_metadata` AS tcm
      ON tc.cat_id = tcm.cdata_cat_id
    JOIN (
        SELECT MIN(cdata_cat_id) AS cdata_cat_id, cdata_lang_id, cdata_name
          FROM `tbl_categories_metadata`
          GROUP BY cdata_name, cdata_lang_id
    ) AS tcm_groups
      ON tcm.cdata_name = tcm_groups.cdata_name AND tcm.cdata_lang_id = tcm_groups.cdata_lang_id
  SET default_name = CASE tc.cat_id
      WHEN tcm_groups.cdata_cat_id THEN tcm.cdata_name
      ELSE CONCAT(tcm.cdata_name, '-', tc.cat_id)
    END
  WHERE tcm.cdata_lang_id = 1

性能

子SELECT 的性能不如平面连接,但在UPDATE 中无法避免。

WHERE tcm.cdata_lang_id = 1 可以添加到子SELECT。这不会影响正确性,但如果cdata_lang_id 上有索引,则可能会导致更有效的查询。最有效的查询将来自(cdata_lang_id, cdata_name) 上的索引。

【讨论】:

    【解决方案2】:

    这可能有效。

    UPDATE tbl_categories a
    INNER JOIN (
      SELECT a.cat_id, MAX(b.cdata_name) cdata_name, ROW_NUMBER() OVER (PARTITION BY cdata_name ORDER BY cat_id) rn
      FROM tbl_categories a 
      INNER JOIN tbl_categories_metadata b ON a.cat_id = b.cdata_cat_id
      WHERE b.cdata_lang_id = 1
      GROUP BY a.cat_id
    ) b ON a.cat_id = b.cat_id
    SET a.cat_identifier = (CASE WHEN b.rn = 1 THEN b.cdata_name ELSE CONCAT(b.cdata_name, '-', a.cat_id) END)
    

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=8f620a00e3d81012a3e1332f13914ed8

    MySQL 5.6 的修订版

    UPDATE tbl_categories a
    INNER JOIN (
      SELECT a.cat_id, MAX(b.cdata_name) cdata_name
      FROM tbl_categories a 
      INNER JOIN tbl_categories_metadata b ON a.cat_id = b.cdata_cat_id
      WHERE b.cdata_lang_id = 1
      GROUP BY a.cat_id
    ) b ON a.cat_id = b.cat_id
    LEFT JOIN (
      SELECT MIN(a.cat_id) cat_id, b.cdata_name
      FROM tbl_categories a 
      INNER JOIN tbl_categories_metadata b ON a.cat_id = b.cdata_cat_id
      WHERE b.cdata_lang_id = 1
      GROUP BY b.cdata_name
    ) c ON a.cat_id = c.cat_id AND b.cdata_name = c.cdata_name
    SET a.cat_identifier = (CASE WHEN c.cat_id IS NOT NULL THEN b.cdata_name ELSE CONCAT(b.cdata_name, '-', a.cat_id) END)
    ;
    

    https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=2c433ca4f20af22f7578dfe31e66db7b

    【讨论】:

      猜你喜欢
      • 2015-02-01
      • 2014-03-13
      • 1970-01-01
      • 2017-06-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      相关资源
      最近更新 更多