【问题标题】:Copying Tables Without Data in MySQL Retaining Auto IncrementMySQL保留自动增量复制没有数据的表
【发布时间】:2014-06-12 18:05:24
【问题描述】:

我在将我的 MySQL 表复制到一个新表时遇到了麻烦,不包括数据,使用查询:

CREATE TABLE foo SELECT * FROM bar WHERE 1=0

表被复制,结构和列名被正确插入。但是 auto_increment 字段和主键字段存在问题,因为它们没有像在原始表中那样插入。 (这些字段不再是 PK 和 AI)我使用的是 MySQL 5.5 和 PMA 3.5.8.2

希望有人能帮帮我。

谢谢你。

【问题讨论】:

    标签: mysql sql database database-schema auto-increment


    【解决方案1】:

    您可能需要运行 2 个查询。

    CREATE TABLE foo LIKE bar;
    ALTER TABLE foo AUTO_INCREMENT = (SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DatabaseName' AND TABLE_NAME = 'bar');
    

    您必须将 DatabaseName 替换为您的数据库名称。这是未经测试的,但我认为它会给你你正在寻找的东西。

    所以我尝试测试上述查询,但由于选择,ALTER TABLE 语句似乎失败了。可能有更好的方法,但对我有用的方法是将自动增量值设置为变量,然后准备语句并执行它。

    例如,您可以先创建表格:

    CREATE TABLE foo LIKE bar;
    

    然后将您的 ALTER TABLE 语句设置为变量

    SET @ai = CONCAT("ALTER TABLE foo AUTO_INCREMENT =", (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename' AND TABLE_NAME = 'bar'));
    

    最后,您将准备并执行语句。

    PREPARE query FROM @ai;
    EXECUTE query;
    DEALLOCATE PREPARE query;
    

    【讨论】:

    • 运行 SQL 语句后,我遇到一个错误:end of input(-1,-1) expected token:( AS AUTO_INCREMENT(1,113) expected token:DROP CONSTRAINT TRIGGER 任何想法我做错了什么?这是我的 SQL 语句: CREATE TABLE foo SELECT * FROM bar WHERE 1=0;ALTER TABLE foo AUTO_INCREMENT = (SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'maknan_db1' AND TABLE_NAME = 'bar');`
    • 确保使用 CREATE TABLE foo LIKE bar;而不是你的 CREATE TABLE foo SELECT * FROM bar WHERE 1 = 0;
    • 您创建表格的方式不是复制有关字段的必要信息。比如哪个字段有auto_increment或者是主键。
    • CREATE TABLE foo LIKE bar;居然做到了!它复制了除原始表中的数据之外的所有内容。谢谢@Rylonian!
    【解决方案2】:

    除了你的列之外,这种语句不会复制表结构:索引、主键、触发器等。您要么需要运行一堆 alter table 语句来添加结构,要么需要先创建包含所有周围结构的表,然后使用您的选择加载它。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2010-10-06
      相关资源
      最近更新 更多