2010-08-20 3 views
4

Мне нужно переименовать столбцы в моей таблице MySQL с помощью PHP.MySQL переименовать столбец из PHP

Это затруднено, потому что синтаксис ALTER TABLE [table] CHANGE COLUMN [oldname] [newname] [definition]. Определение является обязательным параметром.

Есть ли способ захватить определение и просто вернуть его обратно в инструкцию SQL? Некоторые примеры кода были бы фантастическими, спасибо!

+0

Я первоначально отправил ответ на вопрос о переименовании, но я думал, переименовать таблицу, не переименовать столбец. Я удалил его, поскольку он не применим. – JYelton

ответ

1

Согласно http://codingforums.com/showthread.php?t=148936, вам необходимо разобрать результаты SHOW CREATE TABLE, чтобы получить текущее определение, а затем использовать его в инструкции ALTER.

mysql_fetch_field() может быть полезен также.

+0

Да, я видел ту же самую нить перед публикацией здесь. Я надеялся на фрагмент кода, чтобы выполнить работу по разбору существующих данных и созданию нужного мне определения sql. Похоже, мне придется сделать это вручную. благодаря! – psynnott

+0

По крайней мере, с MySQL вам не нужно включать «PRIMARY KEY» в определение столбца, когда это применимо; ключевая спецификация корректируется правильно для изменения имени. – TextGeek

0
  1. Вы можете прочитать information_schema.
  2. SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
0

Issue SHOW CREATE TABLE, считывать строку с описанием столбца, который представляет интерес, определить определение столбца и построить свое ALTER TABLE заявление.

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


    } 

} 
Смежные вопросы