¿Seleccionar todas las columnas excepto una en MySQL?


365

Estoy tratando de usar una instrucción select para obtener todas las columnas de una determinada tabla MySQL, excepto una. ¿Hay una manera simple de hacer esto?

EDITAR: hay 53 columnas en esta tabla (NO ES MI DISEÑO)


66
53 columnas? Me quedaría con SELECT * como Thomas sugiere en ese caso ... a menos que esa columna adicional tenga una gran cantidad de datos que no sería deseable recuperar ...?
Mike Stone el

Excepto una columna ... Supongo que sabes cuál debe ignorarse, por lo tanto, INFORMATION_SCHEMA.columns es el camino.
Alfabravo

¡Mira esta respuesta , hace lo que quieres hacer!
donL

La columna de datos grandes es un problema real cuando se mantienen los datos geográficos. Las columnas pueden tener muchos megabytes de tamaño. Funcionan bien en las cláusulas where para buscar filas, pero a menudo no desea esos datos en los resultados.
Jason

Un uso común para esto es excluir la columna de ID de incremento automático. Por ejemplo, para seleccionar los datos que se insertarán en una tabla diferente, que tiene su propia ID.
ToolmakerSteve

Respuestas:


222

En realidad, hay una manera, por supuesto, necesitas tener permisos para hacer esto ...

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

Sustitución <table>, <database> and <columns_to_omit>


20
advertencia: las consultas INFORMATION_SCHEMA tienen un rendimiento bastante bajo, así que tenga cuidado de que este tipo de consulta no esté en la ruta crítica para nada.
Bill Karwin

99
Como dijo @Jan Koritak a continuación, esta respuesta en realidad no funciona si las columnas del título que desea eliminar también son una subcadena del título para cualquier columna que desee conservar. Hay una mejor respuesta similar a esta que se puede encontrar aquí .
donL

8
Esto es mucho peor que solo especificar las columnas, que es una mejor práctica conocida.
HLGEM

3
Esto no funciona si hay espacios en los nombres de columna. Debería actualizarse para siempre rodear los nombres en las <column_name>
comillas inversas

3
Esto tampoco funcionará si la columna a ignorar es la última que aparece en la estructura de la tabla (porque el reemplazo no coincidirá con el coma final).
Vincent Pazeller

61

En las definiciones mysql (manual) no existe tal cosa. Pero si tiene una gran cantidad de columnas col1, ... col100, lo siguiente puede ser útil:

DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;

44
Me dio un mensaje de error en el tercer paso: "El recuento de columnas no coincide con el recuento de valores en la fila 1". Así que cambié el paso 2 a "ACTUALIZAR temp_tb SET id = NULL" y luego funcionó.
oyvey

1
Ok, esto funciona. Pero cuando vuelvo a ejecutar esta consulta, me da un error, que temp_tb ya existe. ¿Durante cuánto tiempo está temp_tb en la memoria? Disculpas si es una pregunta estúpida. PD votó tu respuesta.
Karan

2
@Karan Para ejecutar esta consulta repetidamente, agregue otro comando al principio:DROP TABLE IF EXISTS temp_tb;
gregn3

1
@Karan Para especificar el motor de memoria, use el comando: de lo CREATE TEMPORARY TABLE temp_tb ENGINE=MEMORY (SELECT * FROM orig_tb); contrario, se guarda en el disco de manera predeterminada y sobrevive al reinicio del servidor. ( gracias )
gregn3

Excelente respuesta Para soltar varias columnas , consulte esta respuesta .
S3DEV

45

¿Una vista funcionaría mejor en este caso?

CREATE VIEW vwTable
as  
SELECT  
    col1  
    , col2  
    , col3  
    , col..  
    , col53  
FROM table

15
¡JAJA! Si seguro. Ahora, ¿cómo construye la vista para incluir todo PERO una de las columnas? Creo que ves cómo esto plantea la pregunta original. De hecho, encontré este hilo específicamente porque quería crear una vista que excluyera ciertas columnas sin ser obligado a enumerar todas las columnas restantes explícitamente en la definición de la vista.
Chris Nadovich

31

Tu puedes hacer:

SELECT column1, column2, column4 FROM table WHERE whatever

sin obtener la columna 3, aunque tal vez estabas buscando una solución más general?


3
La mayoría de las respuestas mejor calificadas en su mayoría solo están buscando formas de generar esta consulta exacta sin escribir a mano
mehtunguh

55
En realidad, por razones de mantenimiento, es útil tener un tipo de consulta "todo menos". De lo contrario, las listas de campos explícitos deben actualizarse si se agregan nuevos campos más adelante.
leiavoia

1
@lev, eso es correcto y DEBEN SER !!! BEporque no sabe si desea tener columnas futuras (pueden ser columnas de metadatos o que no se apliquen a una pantalla en particular). Usted no; desea dañar el rendimiento al devolver más de lo que necesita (lo cual es cierto el 100% del tiempo cuando tiene una unión interna) Le sugiero que lea un poco sobre por qué select * es un antipatrón SQL.
HLGEM

26
El OP indica que hay> 50 columnas, por lo que esto es poco práctico.
augurar

1
@HLGEM No realmente, quería seleccionar todas las columnas sin mantener la consulta cada vez que agrego una nueva columna, excepto una, y esto no funcionaría simplemente en mi caso. Pero de todos modos apliqué la solución de Sean O para mí
OverCoder,

26

Si desea excluir el valor de un campo, por ejemplo, por cuestiones de seguridad / información confidencial, puede recuperar esa columna como nula.

p.ej

SELECT *, NULL AS salary FROM users

13
¿Por qué? No funciona Si tiene un salario de columna, esta consulta terminará con los resultados que tienen dos columnas llamadas salario, una llena de nulos y otra con los salarios reales.
Myforwik

44
@ Myforwik Esta consulta sí agrega una segunda salarycolumna. Pero como se recupera después del *, sobrescribe el original. No es bonito, pero funciona.
Sean O

68
SQL siempre ha permitido nombres de columna duplicados en un conjunto de resultados. Si desea que esto funcione, debe ejecutarlo con una aplicación cliente que no admite duplicados y le da prioridad al último duplicado. El cliente oficial de línea de comandos admite dupes. HeidiSQL también los admite. SQL Fiddle no lo hace, pero muestra el primer duplicado, no el último. En resumen: esto no funciona .
Álvaro González el

99
Por supuesto que no funciona. Este es un gran ejemplo de por qué debería probar sus respuestas en mysql, en lugar de a través de bibliotecas que hablan con mysql.
Myforwik

8
@SeanO, @ Alastair, @ Todos, no anulan. El servidor aún devuelve datos confidenciales.
Pacerier

22

Que yo sepa, no lo hay. Puedes hacer algo como:

SELECT col1, col2, col3, col4 FROM tbl

y elija manualmente las columnas que desee. Sin embargo, si quieres muchas columnas, entonces quizás solo quieras hacer:

SELECT * FROM tbl 

e ignora lo que no quieres.

En su caso particular, sugeriría:

SELECT * FROM tbl

a menos que solo quieras unas pocas columnas. Si solo quieres cuatro columnas, entonces:

SELECT col3, col6, col45, col 52 FROM tbl

estaría bien, pero si desea 50 columnas, entonces cualquier código que haga que la consulta sea (¿demasiado?) difícil de leer.


3
Seleccionar * es una mala elección siempre. No lo recomiendo Lea sobre por qué es un antipatrón SQl.
HLGEM

18

Mientras probaba las soluciones de @Mahomedalid y @Junaid, encontré un problema. Entonces pensé en compartirlo. Si el nombre de la columna tiene espacios o guiones como el check-in, la consulta fallará. La solución simple consiste en utilizar una marca de retroceso alrededor de los nombres de columna. La consulta modificada está debajo

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

11

Si la columna que no deseaba seleccionar tenía una gran cantidad de datos, y no deseaba incluirla debido a problemas de velocidad y seleccionó las otras columnas con frecuencia, le sugiero que cree una nueva tabla con el campo que normalmente no selecciona con una clave de la tabla original y elimine el campo de la tabla original. Únase a las tablas cuando ese campo adicional sea realmente requerido.



8

Mi principal problema son las muchas columnas que obtengo al unir tablas. Si bien esta no es la respuesta a su pregunta (cómo seleccionar todas las columnas excepto una de una tabla), creo que vale la pena mencionar que puede especificar obtener todas las columnas de una tabla en particular, en lugar de solo especificartable. .

Aquí hay un ejemplo de cómo esto podría ser muy útil:

seleccionar usuarios. *, phone.meta_value como teléfono, zipcode.meta_value como código postal

de los usuarios

izquierda unirse a user_meta como teléfono
on ((users.user_id = phone.user_id) AND (phone.meta_key = 'phone'))

left join user_meta como código postal
on ((users.user_id = zipcode.user_id) AND (zipcode.meta_key = 'zipcode'))

El resultado son todas las columnas de la tabla de usuarios y dos columnas adicionales que se unieron desde la metatabla.


2
gracias, necesito seleccionar todas las columnas de la primera tabla y solo un campo de la segunda tabla para unirme y su respuesta me ayudó.
mohammad falahat

5

Me gustó la respuesta @Mahomedalidademás de este hecho informado en el comentario de @Bill Karwin. El posible problema planteado por@Jan Koritak es cierto. Lo enfrenté, pero he encontrado un truco para eso y solo quiero compartirlo aquí para cualquiera que se enfrente al problema.

podemos reemplazar la función REPLACE con la cláusula where en la subconsulta de la instrucción Preparada de esta manera:

Usando mi tabla y nombre de columna

SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;

Entonces, esto va a excluir solo el campo idpero nocompany_id


4

Es una buena práctica especificar las columnas que está consultando incluso si consulta todas las columnas.

Por lo tanto, le sugiero que escriba el nombre de cada columna en la declaración (excluyendo la que no desea).

SELECT
    col1
    , col2
    , col3
    , col..
    , col53

FROM table

Actúa como un contrato con el código y cuando mira la consulta, sabe exactamente qué datos puede extraer de ella sin mirar el esquema de la tabla.
mbillard

66
@kodecraft: es una buena práctica por la misma razón por la que es una buena práctica siempre devolver el mismo tipo de una función (incluso si trabaja en un idioma que no se aplica). Básicamente solo el Principio de Menos Sorpresa.
Daniel Pryden

4

Solo haz

SELECT * FROM table WHERE whatever

Luego suelte la columna en su lenguaje de programación favorito: php

while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
   unset($data["id"]);
   foreach ($data as $k => $v) { 
      echo"$v,";
   }      
}

66
A menos que la columna que desea excluir sea un BLOB enorme o algo así.
Bill Karwin

1
Esto es malo si está tratando de evitar el desperdicio de datos.
Kristopher Ives

1 columna de 53 no debería hacer ninguna diferencia. Si lo hace, probablemente sea un mal diseño.
Petr Peller

1
SElect * es un antipatrón SQL y nunca debe usarse en código de producción.
HLGEM

1
No estoy de acuerdo con que SELECT * sea algún tipo de antipatrón que "nunca" debería usarse en el código de producción. Es mucho más claro que ha recuperado todas sus columnas, en comparación con la referencia cruzada de una larga lista de columnas que, de hecho, pueden ser todos los campos. También, muy obviamente, es más rápido de codificar, con diferencia. Y hay muchos, muchos casos en los que los campos de la tabla corresponderán exactamente a los campos en una vista o formulario.
Geoff Kendall

4

Estoy de acuerdo con la solución "simple" de enumerar todas las columnas, pero esto puede ser oneroso y los errores tipográficos pueden causar mucho tiempo perdido. Uso una función "getTableColumns" para recuperar los nombres de mis columnas adecuados para pegar en una consulta. Entonces todo lo que necesito hacer es eliminar aquellos que no quiero.

CREATE FUNCTION `getTableColumns`(tablename varchar(100)) 
          RETURNS varchar(5000) CHARSET latin1
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE res  VARCHAR(5000) DEFAULT "";

  DECLARE col  VARCHAR(200);
  DECLARE cur1 CURSOR FOR 
    select COLUMN_NAME from information_schema.columns 
    where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  OPEN cur1;
  REPEAT
       FETCH cur1 INTO col;
       IF NOT done THEN 
          set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
       END IF;
    UNTIL done END REPEAT;
  CLOSE cur1;
  RETURN res;

Su resultado devuelve una cadena delimitada por comas, por ejemplo ...

col1, col2, col3, col4, ... col53



4

Sí, aunque puede ser una alta E / S, dependiendo de la tabla, aquí hay una solución que encontré.

SELECT *
INTO #temp
FROM table

ALTER TABLE #temp DROP COlUMN column_name

SELECT *
FROM #temp

Esto será terriblemente lento para cualquier mesa de tamaño moderado.
Joel

3

Estoy de acuerdo en que no es suficiente Select *, si ese que no necesita, como se menciona en otro lugar, es un BLOB, no desea que esa sobrecarga se arrastre.

Crearía una vista con los datos requeridos, luego puede Select *hacerlo con comodidad, si el software de la base de datos los admite. De lo contrario, ponga los enormes datos en otra tabla.


3

Al principio pensé que podrías usar expresiones regulares, pero como he estado leyendo los documentos MYSQL parece que no puedes. Si fuera usted, usaría otro lenguaje (como PHP) para generar una lista de columnas que desea obtener, almacenarla como una cadena y luego usarla para generar el SQL.


3

Yo también quería esto, así que creé una función en su lugar.

public function getColsExcept($table,$remove){
    $res =mysql_query("SHOW COLUMNS FROM $table");

    while($arr = mysql_fetch_assoc($res)){
        $cols[] = $arr['Field'];
    }
    if(is_array($remove)){
        $newCols = array_diff($cols,$remove);
        return "`".implode("`,`",$newCols)."`";
    }else{
        $length = count($cols);
        for($i=0;$i<$length;$i++){
            if($cols[$i] == $remove)
                unset($cols[$i]);
        }
        return "`".implode("`,`",$cols)."`";
    }
}

Entonces, cómo funciona es que ingrese la tabla, luego una columna que no desea o como en una matriz: matriz ("id", "nombre", "cualquier columna")

Entonces, en select, podría usarlo así:

mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");

o

mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");

3

Estoy de acuerdo con la respuesta de @ Mahomedalid, pero no quería hacer algo como una declaración preparada y no quería escribir todos los campos, así que lo que tenía era una solución tonta.

Vaya a la tabla en phpmyadmin-> sql-> select, volcará la consulta: ¡copie, reemplace y listo! :)


2

Si bien estoy de acuerdo con la respuesta de Thomas (+1;)), me gustaría agregar la advertencia de que asumiré que la columna que no desea contiene casi ningún dato. Si contiene enormes cantidades de texto, xml o blobs binarios, tómese el tiempo para seleccionar cada columna individualmente. Su rendimiento sufrirá lo contrario. ¡Salud!


2

La respuesta publicada por Mahomedalid tiene un pequeño problema:

El código de función de reemplazo interno estaba reemplazando "<columns_to_delete>, " por "", este reemplazo tiene un problema si el campo a reemplazar es el último en la cadena de concat debido a que el último no tiene la coma "," y no se elimina de la cuerda.

Mi propuesta:

SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
                  '<columns_to_delete>', '\'FIELD_REMOVED\'')
           FROM INFORMATION_SCHEMA.COLUMNS
           WHERE TABLE_NAME = '<table>'
             AND TABLE_SCHEMA = '<database>'), ' FROM <table>');

Sustitución <table>,<database> y `

La columna eliminada se reemplaza por la cadena "FIELD_REMOVED" en mi caso, esto funciona porque estaba tratando de proteger la memoria. (El campo que estaba eliminando es un BLOB de alrededor de 1 MB)


2

Basado en la respuesta @Mahomedalid, he realizado algunas mejoras para admitir "seleccionar todas las columnas excepto algunas en mysql"

SET @database    = 'database_name';
SET @tablename   = 'table_name';
SET @cols2delete = 'col1,col2,col3';

SET @sql = CONCAT(
'SELECT ', 
(
    SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
), 
' FROM ',
@tablename);

SELECT @sql;

Si tiene muchos cols, use este sql para cambiar group_concat_max_len

SET @@group_concat_max_len = 2048;

2

Puede ser que tenga una solución a la discrepancia señalada de Jan Koritak

SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
    SELECT CASE
    WHEN COLUMN_NAME = 'eid' THEN NULL
    ELSE COLUMN_NAME
    END AS col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );

Mesa :

SELECT table_name,column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'

================================

table_name  column_name
employee    eid
employee    name_eid
employee    sal

================================

Resultado de la consulta:

'SELECT name_eid,sal FROM employee'

1

Si siempre es la misma columna, puede crear una vista que no la tenga.

De lo contrario, no, no lo creo.


1

Puede usar SQL para generar SQL si lo desea y evaluar el SQL que produce. Esta es una solución general, ya que extrae los nombres de columna del esquema de información. Aquí hay un ejemplo de la línea de comandos de Unix.

Sustituyendo

  • MYSQL con tu comando mysql
  • TABLE con el nombre de la tabla
  • Campo excluido con nombre de campo excluido
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL

Realmente solo necesitará extraer los nombres de columna de esta manera solo una vez para construir la lista de columnas excluidas de esa columna, y luego simplemente usar la consulta que ha construido.

Entonces algo como:

column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)

Ahora puede reutilizar la $column_listcadena en las consultas que construya.


1

Me gustaría agregar otro punto de vista para resolver este problema, especialmente si tiene que eliminar una pequeña cantidad de columnas.

Puede usar una herramienta de base de datos como MySQL Workbench para generar la instrucción select por usted, por lo que solo tiene que eliminar manualmente esas columnas para la instrucción generada y copiarla en su script SQL.

En MySQL Workbench, la forma de generarlo es:

Haga clic derecho en la tabla -> enviar al Editor SQL -> Seleccionar toda la declaración.


1

La respuesta aceptada tiene varias deficiencias.

  • Falla donde los nombres de tabla o columna requieren puntos de retroceso
  • Falla si la columna que desea omitir es la última en la lista
  • Requiere enumerar el nombre de la tabla dos veces (una para seleccionar y otra para el texto de la consulta) lo cual es redundante e innecesario
  • Potencialmente puede devolver nombres de columna en el orden incorrecto

Todos estos problemas pueden superarse simplemente incluyendo backticks en el SEPARATORpara su GROUP_CONCATy utilizando una WHEREcondición en lugar de REPLACE(). Para mis propósitos (e imagino muchos otros), quería que los nombres de las columnas se devolvieran en el mismo orden en que aparecen en la tabla. Para lograr esto, aquí usamos una ORDER BYcláusula explícita dentro de la GROUP_CONCAT()función:

SELECT CONCAT(
    'SELECT `',
    GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
    '` FROM `',
    `TABLE_SCHEMA`,
    '`.`',
    TABLE_NAME,
    '`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
    AND `TABLE_NAME` = 'my_table'
    AND `COLUMN_NAME` != 'column_to_omit';

0

Tengo una sugerencia pero no una solución. Si algunas de sus columnas tienen conjuntos de datos más grandes, entonces debería intentar con lo siguiente

SELECT *, LEFT(col1, 0) AS col1, LEFT(col2, 0) as col2 FROM table

-1

Llegué bastante tarde en encontrar una respuesta para esto, dicho es como siempre lo he hecho y, francamente, es 100 veces mejor y más ordenado que la mejor respuesta, solo espero que alguien lo vea. Y encontrarlo útil

    //create an array, we will call it here. 
    $here = array();
    //create an SQL query in order to get all of the column names
    $SQL = "SHOW COLUMNS FROM Table";
        //put all of the column names in the array
        foreach($conn->query($SQL) as $row) {
            $here[] = $row[0];
        }
    //now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
    $key = array_search('ID', $here);
    //now delete the entry
    unset($here[$key]);

Puede que esté ordenado, pero no responde a la pregunta: no ha preguntado sobre php, y no da una declaración de selección o el resultado de lo que quiere, sino solo una matriz de php que contiene las columnas que desea.
gou1

2
–1. Esto no es código SQL, y no hay ninguna SELECTdeclaración aquí, la palabra ni siquiera aparece una vez.
Frungi

Esto es más simple en la medida en que (a) se sienta más cómodo con PHP que con SQL, o (b) le guste distribuir su código en varias líneas para facilitar su lectura. Reconozco el punto (b). Su enfoque también sería menos eficaz, aunque la diferencia sería menor en muchos casos de uso. También vea otros comentarios sobre su pregunta. No vale la pena gritar, así que sugiero que elimine su comentario inapropiado de la pregunta original.
mc0e

-5

Select * es un antipatrón SQL. No debe usarse en el código de producción por muchas razones, incluyendo:

Se tarda un poco más en procesar. Cuando las cosas se ejecutan millones de veces, esas pequeñas partes pueden importar. Una base de datos lenta donde la lentitud es causada por este tipo de codificación descuidada es el tipo más difícil de ajustar.

Significa que probablemente esté enviando más datos de los que necesita, lo que causa cuellos de botella en el servidor y en la red. Si tiene una unión interna, las posibilidades de enviar más datos de los que necesita son del 100%.

Causa problemas de mantenimiento, especialmente cuando ha agregado nuevas columnas que no desea ver en todas partes. Además, si tiene una nueva columna, es posible que deba hacer algo en la interfaz para determinar qué hacer con esa columna.

Puede romper vistas (sé que esto es cierto en el servidor SQl, puede o no ser cierto en mysql).

Si alguien es lo suficientemente tonto como para reconstruir las tablas con las columnas en un orden diferente (lo cual no debe hacer pero sucede todo el tiempo), todo tipo de código puede romperse. Especialmente codifique un inserto, por ejemplo, donde de repente está colocando la ciudad en el campo address_3 porque no especifica, la base de datos solo puede ir en el orden de las columnas. Esto es lo suficientemente malo cuando cambian los tipos de datos, pero peor cuando las columnas intercambiadas tienen el mismo tipo de datos, ya que puede insertar datos incorrectos que son un desastre para limpiar. Debe preocuparse por la integridad de los datos.

Si se usa en una inserción, la romperá si se agrega una nueva columna en una tabla pero no en la otra.

Puede romper los disparadores. Los problemas de activación pueden ser difíciles de diagnosticar.

Agregue todo esto al tiempo que toma agregar los nombres de las columnas (diablos, incluso puede tener una interfaz que le permita arrastrar los nombres de las columnas (sé que lo hago en SQL Server, apuesto a que hay alguna forma de hacer esto es alguna herramienta que utiliza para escribir consultas mysql.) Veamos, "Puedo causar problemas de mantenimiento, puedo causar problemas de rendimiento y problemas de integridad de datos, pero bueno, ahorré cinco minutos de tiempo de desarrollo". en las columnas específicas que quieras.

También le sugiero que lea este libro: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1- 1 y palabras clave = sql + antipatterns

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.