2010-02-15 9 views
39

Ya tengo una tabla que consiste en datos. Necesito modificar la tabla para agregar dos columnas nuevas que no son nulas. ¿Cómo puedo hacer eso sin perder ningún dato existente?Agregue columnas que no admiten nulos a una tabla existente en el servidor SQL?


Esto es lo que he intentado (a través de clic derecho en la tabla y seleccionando Diseño):

  1. Añadido nuevas columnas 'EmpFlag' (bit, null), 'CreatedDate' (fecha y hora, nula)

  2. Columna 'EmpFlag' actualizada en la tabla, para tener algunos valores válidos. (Solo quería trabajar en un campo, así que no actualicé el campo 'CreatedDate')

  3. Ahora, haga clic con el botón derecho en la tabla, diseñe y haga que no sea nula.

Cuando traté de salvar, este mensaje de error apareció:

Almacenamiento de cambios no está permitido. Los cambios que ha realizado requieren que se eliminen y vuelvan a crear las siguientes tablas.

+0

Creo que es una limitación de la herramienta de diseño SSMS. Intente hacerlo con una declaración de SQL: "Alterar la tabla nombre de tabla alterar la columna EmpFlag bit not null". Simplemente ejecute una nueva consulta con esto y cambie el nombre de la tabla con el nombre real. –

+5

Esto tiene poco que ver con los detalles del cambio realizado, sino que refleja el nuevo comportamiento predeterminado en SSMS: para evitar que las personas realicen sin darse cuenta cambios desastrosos en grandes tablas de producción que esencialmente los desconectarán durante el tiempo necesario para copiar los datos y volver a poblar la tabla. Puede desactivar esta opción desde Herramientas> Opciones> Diseñadores> Tabla + Diseñadores de BD> Evitar guardar cambios ... (desmarque esto). Sin embargo, tenga mucho cuidado al hacer estos cambios en las tablas de producción. –

Respuesta

60

Usted acaba de establecer un valor predeterminado en las nuevas columnas y eso le permitirá agregarlas.

alter table table_name 
    add column_name datetime not null 
     constraint DF_Default_Object_Name default (getdate()) 

o éste para un campo varchar.

alter table table_name 
    add column_name varchar(10) not null 
     constraint DF_Default_Object_Name default ('A') 

También puede soltar el valor predeterminado si no lo necesita después de agregar la columna.

alter table table_name 
    drop constraint DF_Default_Object_Name 
+0

Esta respuesta es correcta. – mwigdahl

+0

debe proporcionar algún código de muestra – Manu

+2

Tenga en cuenta que si tiene un factor de relleno del 100% (el valor predeterminado), agregar datos a todas las filas como este provocará una serie de divisiones de página. Esta es una gran cantidad de E/S, y creo que esta es una operación de bloqueo. Esto está bien en una tabla moderadamente pequeña, pero si tiene una tabla grande y de alto rendimiento, básicamente se trata de una operación fuera de línea. Que yo sepa, la única manera de hacer esto como una operación "en línea" es crear una nueva tabla con la estructura deseada; fusionar los datos con desencadenantes y operaciones por lotes; y finalmente cambiar la nueva tabla en una sola transacción (los sinónimos funcionan bien) – ahains

20

Si no desea colocar un defecto en las columnas, puede:

  1. crear las nuevas columnas como nullable
  2. actualizar los datos existentes apropiadamente
  3. añadir el NO NULL restricción
+1

Prefiero este enfoque para definir un valor predeterminado ... – gbn

+0

En general, estoy de acuerdo, pero depende del escenario. Si está agregando columnas como CreatedDate y ModifiedDate, puede aplicar los valores predeterminados y luego volver atrás y ajustar los datos anteriores si lo desea, entonces no tiene que preocuparse por el tiempo de inactividad (o nuevas filas que se deslizan) entre 2 y 3. En los casos en los que un valor predeterminado estándar tiene sentido, esto le brinda la flexibilidad de no sincronizar todo el código que aún no conoce acerca de la (s) nueva (s) columna (s). –

+0

Esto fue útil para el paso 3 - [Alteración de una columna: nulo para que no sea nulo] (https://stackoverflow.com/q/689746/188926) – Dunc

0

Agregar nuevas columnas NOT NULL con valores predeterminados se puede hacer en la GUI como se muestra a continuación. Cambiar una existente a NOT NULL parece ser una historia diferente. Recibo el mismo mensaje que tuviste. Una opción sería crear una nueva columna NOT NULL con un valor predeterminado para reemplazar la columna anterior y luego copiar los datos de la columna anterior a los nuevos datos de la columna.

  1. mesa puestos en la vista Diseño (clic derecho en table-> seleccione Diseño)
  2. Añadir columna, seleccione el tipo de datos
  3. Desactive Permitir valores nulos y establecer Valor predeterminado o Encuadernación = su los valores por defecto, como a continuación

enter image description here

Cuestiones relacionadas