【问题标题】:PHP/MySQL: Move data from old database (tables without an ID) to new database (tables with an ID)PHP/MySQL:将数据从旧数据库(没有 ID 的表)移动到新数据库(有 ID 的表)
【发布时间】:2019-05-22 13:00:27
【问题描述】:

我有一个函数可以将所有表及其列从旧数据库转移到新数据库。到目前为止一切正常。现在我需要扩展该函数,以便在我的新数据库内的所有表中添加一个代理键(具有自动增量的主键 ID)。

旧数据库:

+-----------------------------------+------------+--------+
|               Col1                |    Col2    | NumCol |
+-----------------------------------+------------+--------+
| Value 1                           | Value 2    |    123 |
| This is a row with only one cell  |            |        |
| This row is testing html entities | Te<br />st |     45 |
+-----------------------------------+------------+--------+

新数据库:

+----+-----------------------------------+------------+--------+
| ID |               Col1                |    Col2    | NumCol |
+----+-----------------------------------+------------+--------+
|  1 | Value 1                           | Value 2    |    123 |
|  2 | This is a row with only one cell  |            |        |
|  3 | This row is testing html entities | Te<br />st |     45 |
+----+-----------------------------------+------------+--------+

如您所见,除了每个表中的新列 ID 之外,一切都保持不变。

这是我将所有内容从旧数据库复制到新数据库的功能:

public function loadOldDBtoNewDB($oldDB,$newDB){
    $sqlshowTables = "SHOW TABLES ";
    $statement = $this->db->prepare($sqlshowTables);
    $statement->execute();
    $tables = $statement->fetchAll(PDO::FETCH_NUM);

    foreach($tables as $table){
        $sql[] = "INSERT INTO ".$newDB.".`".$table[0]."` SELECT * FROM ".$oldDB.".`".$table[0]."`; ";
    }

    $sqlState = implode(' ', $sql);
    $executeStatement = $this->db->exec($sqlState);

}

注意:当我运行这个函数时,旧数据库和新数据库已经存在。

那么我需要如何更改我的插入语句,以便在每次插入期间添加一个 ID(自动递增)列?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您的新表在id 列上应该已经有一个AUTO_INCREMENT。然后在进行选择时为其提供NULL 值!

    如果您的新表没有在 ID 列上设置自动增量,请添加它

    ALTER TABLE `mytablename` 
    CHANGE `ID` `ID` INT(11) NOT NULL AUTO_INCREMENT 
    

    SELECT 中的* 之前添加NULL - 这将强制ID(出现在您的列列表中的第一个)使用AUTO_INCREMENT,因为它不能是NULL .

    $sql[] = "INSERT INTO ".$newDB.".`".$table[0]."` SELECT NULL, * FROM ".$oldDB.".`".$table[0]."`; ";
    

    【讨论】:

    • 感谢您为我指明了正确的方向。您的答案是正确的,我会将其标记为已接受的答案。谢谢!
    【解决方案2】:

    你也可以使用以下命令创建新表

    create table new_table as (select * from old_table);
    
    alter table new_table add column id primary key auto_increment;
    
    

    【讨论】:

    • 谢谢你的回答也是正确的。 @Qirel 的速度更快,因此我会将他的答案标记为已接受的答案。
    猜你喜欢
    • 2015-07-09
    • 2023-03-26
    • 2011-07-14
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多