¿Cómo puedo proporcionar definiciones de datos actuales para una columna al cambiar el nombre de la columna en MariaDB (via PHP)?

Tengo una función que modificará los nombres de columna en una tabla MariaDB. Si uso MySQL o MariaDB versión 10.5.2+ puedo usar la siguiente consulta simple:

ALTER TABLE t1 RENAME COLUMN c_old TO c_new;

Sin embargo, en versiones anteriores de MariaDB Me veo obligado a usar lo más complicado CHANGE comando, like this:

ALTER TABLE t1 CHANGE c_old TO c_new [data_definitions];

El data_definiciones podría ser por ejemplo varchar(80) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT 'Column for the username'. Es la creación de la cadena de definición de datos que causa algunos problemas para mí.

Así que, me pregunto cómo puedo conseguir/crear definiciones de datos cadena en PHP para hacer la consulta correcta para cambiar los nombres de columna. Mi código se ve así por el momento:

php
function rename_column($mysqli, $table, $current_name, $new_name) {
 
    $data_definitions = // How do I find/get these in a simple way?

    $sql = "ALTER TABLE {$table} CHANGE `{$current_name}` `{$new_name}` {$data_definitions}";
    $res = $mysqli-query($sql);
    if (!res) {
        echo "'$sql' failed. Error: " . $mysqli->error; 
        return false; 
    }
    return $res;
}
?>

He pensado en hacer una consulta como SHOW FULL COLUMNS FROM $table WHERE field = '$current_name' para leer cada data_definición y construir una cadena para cada definición, pero me pregunto si puede ser resuelto de una manera más simple?

Pregunta hecha hace 3 años, 5 meses, 1 días - Por binaryblossom


2 Respuestas:

  • Puedes obtener las definiciones de datos de la columna directamente utilizando consultas SQL en lugar de intentar construir la cadena manualmente. Aquí tienes un ejemplo de cómo puedes hacerlo:

    ```php function renamecolumn($mysqli, $table, $currentname, $new_name) {

    $sql = "SHOW CREATE TABLE {$table}";
    $res = $mysqli->query($sql);
    $row = $res->fetch_assoc();
    $create_table_query = $row['Create Table'];
    
    preg_match("/`$current_name`(.+?),/", $create_table_query, $matches);
    $data_definitions = trim($matches[1]);
    
    $sql = "ALTER TABLE {$table} CHANGE `{$current_name}` `{$new_name}` {$data_definitions}";
    $res = $mysqli->query($sql);
    if (!$res) {
        echo "'$sql' failed. Error: " . $mysqli->error; 
        return false; 
    }
    return $res;
    

    } ```

    En este código, primero obtienes la definición completa de la tabla utilizando la consulta SHOW CREATE TABLE y luego usas expresiones regulares para extraer la definición de datos de la columna específica que quieres renombrar. Finalmente, utilizas esta definición de datos en la consulta ALTER TABLE para cambiar el nombre de la columna.

    Es importante tener en cuenta que este enfoque asume que la columna que quieres renombrar está definida como parte de la creación de la tabla y no ha sido modificada posteriormente con comandos ALTER TABLE. Si hay cambios posteriores en la columna, puede que necesites un enfoque más sofisticado para manejarlos correctamente.

    Respondida el Dec 19, 2020 a las 12:47 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Puedes utilizar la función mysqli_fetch_field() de PHP para obtener información sobre las columnas de una tabla, incluyendo sus definiciones de datos. Aquí tienes un ejemplo modificado de tu función rename_column() que utiliza esta función:

    ```php function renamecolumn($mysqli, $table, $currentname, $new_name) { $result = $mysqli->query("SHOW FULL COLUMNS FROM {$table}"); if (!$result) { echo "'SHOW FULL COLUMNS FROM {$table}' failed. Error: " . $mysqli->error; return false; }

    while ($field = $result->fetch_field()) {
        if ($field->name == $current_name) {
            $data_definitions = $field->db_type;
            if ($field->charset != '') {
                $data_definitions .= " CHARACTER SET {$field->charset}";
            }
            if ($field->collation != '') {
                $data_definitions .= " COLLATE {$field->collation}";
            }
            if ($field->not_null) {
                $data_definitions .= " NOT NULL";
            }
            if ($field->default != '') {
                $data_definitions .= " DEFAULT '{$field->default}'";
            }
            if ($field->comment != '') {
                $data_definitions .= " COMMENT '{$field->comment}'";
            }
            break;
        }
    }
    $result->free();
    
    if (!isset($data_definitions)) {
        echo "Column '{$current_name}' not found in table '{$table}'";
        return false;
    }
    
    $sql = "ALTER TABLE {$table} CHANGE `{$current_name}` `{$new_name}` {$data_definitions}";
    $res = $mysqli->query($sql);
    if (!$res) {
        echo "'$sql' failed. Error: " . $mysqli->error; 
        return false; 
    }
    return $res;
    

    } ```

    Esta función primero recupera información sobre todas las columnas de la tabla especificada utilizando la consulta SHOW FULL COLUMNS FROM {$table}. A continuación, recorre los resultados y busca la columna con el nombre $current_name. Una vez encontrada la columna, construye la cadena $data_definitions basándose en la información obtenida de la función mysqli_fetch_field(). Por último, utiliza esta cadena en la consulta ALTER TABLE para cambiar el nombre de la columna.

    Respondida el Dec 19, 2020 a las 12:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0