在PHP中重命名MySQL列

4
我需要使用PHP重命名MySQL表中的列。
这比较困难,因为语法是ALTER TABLE [table] CHANGE COLUMN [oldname] [newname] [definition]。 定义是必填参数。
是否有一种方法可以获取定义并将其简单地反馈到SQL语句中? 一些示例代码会很棒,谢谢!

我原本发布了一个关于重命名的答案,但我当时想到的是重命名表格而不是重命名列。因为不适用,所以我将其删除了。 - JYelton
4个回答

1

是的,在发布这里之前,我看到了同样的帖子。我希望有一个代码片段来解析现有数据并创建我需要的定义SQL。看起来我得手动完成它。谢谢! - psx
至少在MySQL中,当适用时,您不必在列定义中包含“PRIMARY KEY”;键规范会根据名称更改进行正确调整。 - TextGeek

0

我的解决方案是这样的:

$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>";
        }


    }

}

0
  1. 你可以读取 information_schema
  2. SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

0

问题:执行SHOW CREATE TABLE命令,找到所需列的描述行,确定该列的定义并构造ALTER TABLE语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接