¿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, 2 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 consultaALTER 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ónrename_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ónmysqli_fetch_field()
. Por último, utiliza esta cadena en la consultaALTER 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