【问题标题】:MySQL rename column from within PHPMySQL 从 PHP 中重命名列
【发布时间】:2010-08-20 15:59:48
【问题描述】:

我需要使用 PHP 重命名 MySQL 表中的列。

这很困难,因为语法是ALTER TABLE [table] CHANGE COLUMN [oldname] [newname] [definition]。定义是必需的参数。

有没有办法获取定义并将其简单地反馈到 SQL 语句中?一些示例代码会很棒,谢谢!

【问题讨论】:

  • 我最初发布了一个关于重命名的答案,但我在想重命名表,而不是重命名列。因为不适用所以删了。

标签: php mysql alter-table


【解决方案1】:

根据http://codingforums.com/showthread.php?t=148936,您可能需要解析SHOW CREATE TABLE 的结果以获取当前定义,然后在ALTER 语句中使用它。

mysql_fetch_field() 也可能有用。

【讨论】:

  • 是的,我在发帖之前看到了同样的帖子。我希望代码 sn-p 来完成解析现有数据并创建我需要的定义 sql 的工作。看起来我将不得不手动完成。谢谢!
  • 至少对于 MySQL,您不必在适用时在列定义中包含“PRIMARY KEY”;密钥规范已针对名称更改进行了正确调整。
【解决方案2】:
  1. 您可以阅读information_schema。 罢工>
  2. SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

【讨论】:

    【解决方案3】:

    发出SHOW CREATE TABLE,读出描述感兴趣列的行,确定列定义并构建您的ALTER TABLE 语句。

    【讨论】:

      【解决方案4】:

      我的解决方案是这样的:

      $table = "tableName";
      $createTableSQL = $dbh->Execute('SHOW CREATE TABLE ' . $table);
      $createTableSQL = $createTableSQL[0][1];
      
      $mappingTable = "originalToDevMapping";
      
      //get mapping
      $sql = "SELECT origField, newField
              FROM " . $mappingTable;
      $newColumns = $dbh->Execute($sql);
      
      foreach ($newColumns as $newColumn) {
          if (strlen($newColumn['newField'])<1) {
              echo "***Removing*** " . $newColumn['origField'] . "<br><br>";
      
              $sql = "ALTER TABLE " . $table . " DROP COLUMN " . $newColumn['origField'];
      
              $dbh->Execute($sql);
              if (strlen($dbh->errorStr)>1) {
                  echo "<br>************************<br>";
                  echo "<br>ERROR:<br>";
                  echo $dbh->errorStr;
                  echo "<br>************************<br>";
              }
      
          } else {
              echo "Renaming " .  $newColumn['origField'] . " to " . $newColumn['newField'] . "<br><br>";
              $sql = "ALTER TABLE " . $table . " CHANGE COLUMN " . $newColumn['origField'] . " " . $newColumn['newField'];
              $fieldPos = strpos($createTableSQL,$newColumn['origField']);
              $definitionStart = $fieldPos + strlen($newColumn['origField']) + 2;
              $definitionEnd = strpos($createTableSQL,',',$definitionStart) - 1;
              $definition = substr($createTableSQL,$definitionStart,$definitionEnd-$definitionStart+1);
      
              //workaround - if enum type, comma is included.  
              if (strstr($definition,'enum')) {
                  //look for comma after enum end bracket.
                  $commaPos = strpos($createTableSQL, ',', strpos($createTableSQL,')',$definitionStart));
                  $definition = substr($createTableSQL,$definitionStart,$commaPos-$definitionStart);
              }
      
              $dbh->Execute($sql . " " . $definition);
              if (strlen($dbh->errorStr)>1) {
                  echo "<br>************************<br>";
                  echo "ERROR:<br>";
                  echo $dbh->errorStr;
                  echo "<br>************************<br>";
              }
      
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多