2010-12-09 18 views
15

Tengo una vieja mesa con FKs en ella. Quiero agregar una nueva columna. Querré hacer de esta nueva columna mi clave principal. Así que pensé que podría insertar esa columna como la primera o insertarla al final de mi tabla y volver a ordenar mis columnas después.¿Por qué no puedo reordenar mis columnas de SQL Server?

Pero SQL Server Management Studio no me permitió hacer eso. Entiendo que no puedo hacer eso, y que el orden de las columnas es casi completamente irrelevante en SQL.

Lo que quiero saber es cómo es que ... Quiero decir, puedo dejar caer una columna ... ¿no es lo mismo que agregar una nueva?

Estoy tratando de entender lo que está pasando. También me ha costado encontrar documentación para eso. Si alguien puede señalarme en la buena dirección.

+1

¿Puede decirnos qué versión de servidor sql está utilizando y cuál es el mensaje de error exacto que obtiene? Supongo que puede ser una configuración que no le permitirá realizar cambios que requieren una tabla para recrearse. – Ryan

+0

Perdón por el retraso, la fiesta de Navidad retrasó mi trabajo jeje. Estoy usando MSSQL Server 2008 R2 (estudio de administración). El mensaje de error es: "Guardar cambios no está permitido. Los cambios que ha realizado requieren que se eliminen y vuelvan a crear las siguientes tablas. Ha realizado cambios en una tabla que no se puede volver a crear o no se ha habilitado. opción Impedir guardar cambios que requieren que la tabla se vuelva a crear ". –

+0

posible duplicado de [¿Puedo volver a ordenar columnas en una tabla?] (Http://stackoverflow.com/questions/1610/can-i-logically-reorder-columns-in-a-table) – bummi

Respuesta

5

que podría estar interesado en las respuestas a this question.

En cuanto a por qué no se puede cambiar el orden de las columnas (aparte de los SSMS específicos respuestas publicadas), no estoy seguro de que encontrará una respuesta canónica, que no sea el estándar SQL contiene ninguna sintaxis programática para hacer Entonces, la única forma de redefinir el esquema de una tabla (incluido el orden de sus columnas) es soltar la tabla y volver a crearla. Por lo tanto, cualquier aplicación de administración que proporcione "reordenación" de columna probablemente lo haga entre bastidores (por ejemplo, la Vista de diseño de SSMS, como se señala en la pregunta vinculada).

Una persona con un conocimiento más profundo de la especificación SQL podría contradice esto si hay es una razón explícita para no proporcionar un mecanismo de columna de reordenamiento como parte de la norma DDL, pero sólo podemos conjeturar que, dado que las consultas definen el orden de columnas en sus resultados de todos modos, y DBMSes controlan el almacenamiento físico de acuerdo con su implementación individual, ese orden de columnas lógicas es esencialmente sin sentido y no garantiza tal mecanismo.

+4

El hecho de que el orden de las columnas no proporcione valor en el contexto de ninguna declaración de SQL es canónico para mí: usted selecciona las columnas que desee, en el orden que desee. –

+0

De acuerdo. Supongo que estaba tratando de calificar mi declaración señalando que puede haber o no una razón más explícita. Pero estoy de acuerdo en que no creo que sea necesario. –

+0

Creo que este es el cierre de una respuesta que obtuve. ¡Muchas gracias! Creo que tiene sentido que, si no existe una necesidad lógica para esto, los creadores de SQL no incluirían la funcionalidad que conduce a una función casi inútil. –

6

columnas Reordenamiento es básicamente el mismo que rehacer la mesa, que es la solución si los cambios que requieren la recreación están desactivadas:

SELECT (fields in DESIRED order) 
INTO MyNewTable 
FROM OldTable 
1

Si mi sospecha es correcta, tiene una configuración activada que debe desactivar para permitir que se guarden los cambios que requieren que se vuelva a crear una tabla.

Abra SQL Server Management Studio y utilizar el menú para ir a Herramientas> Opciones

En el menú de opciones de la izquierda seleccione diseñadores

en la tabla de opciones del panel de la derecha Compruebe que la casilla de verificación junto a la configuración "Impedir guardar cambios que requieren la recreación de la tabla" está desmarcada.

Después de confirmar que se hace, intente volver a ordenar sus columnas.

+0

De hecho, funcionó. Ahora necesito saber si es seguro, y aún así, por qué no podemos hacer esto sin volver a crear la mesa. Gracias –

22

Definitivamente puedes. Desmarque esta opción en SQL Server Management Studio:
Herramientas> Opciones> Diseñadores> Evitar guardar cambios que requieran recreación de tablas.

Options dialog

+7

Afortunadamente es innecesario decirlo pero lo diré de todos modos. Esto puede matar tablas. Si va a cualquier lugar cerca de las bases de datos de producción, le recomiendo que vuelva a activar esa bandera tan pronto como haya realizado su cambio. – Robb

+0

Estoy totalmente de acuerdo, especialmente para mesas grandes, podría ser realmente dañino. –

+0

Esto ha funcionado para mi problema. Estaba buscando esta opción en las propiedades de la tabla. Mi tabla actual tiene 66 filas y 1 FK en una tabla de idiomas. Lo probaré para ver si rompe mis cosas. ¡¡Gracias!! –

0

Lo que yo quiero saber, es ¿cómo es que ... quiero decir, puedo eliminar una columna ... ¿No es lo mismo que la adición de una nueva?

La caída de una columna se basa en el nombre de columna, no en la posición ordinal (columna primera/segunda/tercera/etc.). Agregar una columna siempre se agrega al final de la lista de columnas. Esto refuerza que la secuencia de columnas es completamente irrelevante para los datos además de las operaciones de SQL. No sé cómo ves tampoco como similar ...

Sin bases de datos SQL Conozco la posibilidad de insertar columnas en un orden particular en una tabla existente. PHPMyAdmin proporcionó la funcionalidad, pero debajo de las cubiertas la función está creando una nueva tabla con el orden de columnas deseado, copiando los datos de la tabla anterior a la nueva, y finalmente eliminando/dejando caer la tabla anterior.

fin Columna proporciona ningún beneficio para las operaciones ...

+5

* proporciona * un beneficio a los desarrolladores de OCD leve, sin embargo ...;) –

+0

@djacobson: Tuve que apoyar DBA con tales requisitos OCD - pérdida de tiempo, dinero y recursos. Hecho estadístico de que cuanto más cambias, más puede/irá mal. –

+0

Woof. Eso es lamentable. Fue su solución escribir un generador de scripts que escupiría una nueva instrucción 'CREATE TABLE' para la tabla dada con las columnas en el orden deseado, junto con las declaraciones de tabla desplegable y de datos de copia asociados, y ejecutar eso en la base de datos ? :) –

0

usted no quiere hacer eso a menos que la tabla no contiene datos y no está en producción! La razón es que tiene que llevar los registros existentes a una tabla temporal, eliminar la tabla anterior, cambiar el nombre de la tabla temporal. Esto es algo muy malo de hacer en una tabla existente en producción. Es estúpido confiar en el orden de las columnas en las consultas de todos modos, por lo que esta es una tarea completamente innecesaria. Esto es algo que puede causar mucho dolor, literalmente sin ganancia. No siga por este camino, incluso si encuentra una solución.

+0

Hola HLGEM, por favor, lee mi publicación con cuidado, realmente no quiero hacer esto :) Lo que realmente quiero es saber por qué alguien no puede hacer esto. Pero gracias por las advertencias, aunque jeje :) –

+0

Puedes hacerlo solo creando una tabla y moviendo los datos a ella. Es por eso que es una idea pobre y por qué no está permitida en general porque puede crear enormes problemas con el acceso a la base de datos existente si lo hace. – HLGEM

Cuestiones relacionadas