【问题标题】:Mysql: how do I make an exact working copy of a table?Mysql:如何制作表的精确工作副本?
【发布时间】:2011-02-22 01:25:49
【问题描述】:

我正在对遗留数据库及其相关应用程序进行重组。为了保持新旧并行工作,我创建了一个开发数据库并将感兴趣的表复制到其中,例如

create database devdb;

drop table if exists devdb.tab1;
CREATE TABLE devdb.tab1 like working.tab1;
insert into devdb.tab1 select * from working.tab1;

完成此操作后,我注意到影响 tab1 的触发器尚未被复制。有什么方法可以生成 tab1 的工作副本,即数据、权限、触发器等所有内容?

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    嗯,事后看来有点明显,但似乎通过 mysqldump 转储表并将这些转储加载到新数据库中会恢复触发器(我希望有任何其他相关信息)。

    很遗憾,因为我想通过 DbVisualizer 数据库管理器来完成整个过程。你每天都能学到一些东西......

    【讨论】:

      【解决方案2】:

      请注意,“create table x select * from y”语法将不会创建表的精确工作副本,即使您不关心触发器什么的。新表将:

      • 使用默认的 MyISAM 表类型(即使父表是 InnoDB)
      • 默认为 Latin1 字符集(即使父表是 UTF-8)
      • 可能会清除 auto_incremented 字段的值并将其替换为 0(取决于表结构,但如果发生在您身上真的很糟糕)

      【讨论】:

      • 我刚刚发出命令CREATE TABLE IF NOT EXISTS new_table SELECT * FROM old_table1, old_table2 WHERE FALSEinformation_schema.tables 显示其引擎为innodb
      【解决方案3】:

      有一种更快的方法来重新创建结构和导入数据(尽管您丢失了索引;)):

       create table devdb.tab1 select * from working.tab1;
      

      对于触发器和好友,您必须在 information_schemas 中查询

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多