Cómo establecer un valor predeterminado para una columna existente

375

Esto no funciona en SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

El error es:

Sintaxis incorrecta cerca de la palabra clave 'SET'.

¿Qué estoy haciendo mal?

Nakul Chaudhary
fuente
1
¿Qué leíste de MSDN ALTER TABLE dijo ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn
1
Esa es la sintaxis de mysql.
Benjamin Goodacre
¿Por qué no todos pueden apegarse a un estándar? (no es una pregunta real, todos se refieren a microsoft y mysql u otros proveedores). ¿hay incluso una forma estándar ansi / iso de hacer esto?
joedotnot

Respuestas:

566

Esto funcionará en SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
Yuck
fuente
6262
+1 para especificar un nombre de restricción, por lo que SQL Server no crea uno aleatorio.
HardCode
36
MSSQL es extraño para llamar a los valores predeterminados "restricciones". En todo caso, son relajaciones ; lo contrario de una restricción! Hacen que más cosas sean válidas, no menos.
Roman Starkov
44
No es extraño si piensa de una manera alternativa como: La restricción predeterminada evita que MSSQL arroje un error si no especifica la columna. Por lo tanto, no es una restricción para el usuario, pero es una restricción para MSSQL.
Jonny Piazzi
44
Esto solo funciona si no hay una restricción predeterminada existente en la columna.
pmcilreavy
44
@fallenidol Esto solo funciona si no hay una restricción predeterminada existente en la columna. Correcto, porque por definición no puede tener más de un valor predeterminado ...
Yuck
165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn
hoodaticus
fuente
3
Esto funciona en MSSQL, pero tiene la desventaja de que no nombra la restricción que crea detrás de escena (vea la respuesta más votada arriba).
Contango
10
@Contango Creo que es mejor no molestarse en nombrar cada restricción en el caso de que necesite modificar una de ellas. Simplemente escriba un procedimiento para eliminar restricciones nombradas automáticamente y nunca más tendrá que nombrar una + puede ocuparse de todas las demás sin nombre
JonnyRaa
3
@ Jonny Leeds. Buen punto. También me gusta nombrar las restricciones, ya que es una buena documentación para cualquier persona que intente modificar (o simplemente entender) el esquema de la base de datos. Esto es menos importante si uno es un operador en solitario que trabaja en un equipo de uno.
Contango
1
(¡EESH! ¡Perdón por la falta de avances de línea - pegado a continuación para mayor claridad!) Necesitaba que se volviera a ejecutar y encontré esta forma de verificar si ya se había hecho ... SI EXISTE (SELECCIONE * DE information_schema.columns DONDE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) COMIENCE ALTER TABLE [myDBO]. [myTable] AGREGAR POR DEFECTO 0 PARA [myColumn] END
Dave
44
Si solo hay una restricción predeterminada ... ¿por qué tiene que nombrarla? Parece que otros motores de bases de datos proporcionan sintaxis para agregar, actualizar y eliminar el valor predeterminado de una columna sin otro nombre que no sea el nombre de la columna, lo cual tiene sentido. El código anterior falla, por cierto, si ya existe un valor predeterminado. Es ridículo que SQL Server requiera una combinación compleja contra una tabla del sistema solo para identificar el nombre de la restricción predeterminada, lo que no debería ser necesario porque solo puede haber una restricción predeterminada en una columna.
Triynko
51

no puede usar la columna alter para eso, use add en su lugar

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn
Carlos Quintanilla
fuente
99
No sé por qué esta respuesta no recibe votos positivos. Es exactamente el mismo que el anterior y fue respondido antes ...
spankmaster79
30

La forma correcta de hacer esto es la siguiente:

  1. Ejecute el comando:

    sp_help [table name] 
  2. Copie el nombre de la CONSTRAINT.

  3. Suelta el DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Ejecute el comando a continuación:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
usuario3310402
fuente
44
StackOverflow.com es solo en inglés. El sitio portugués es pt.stackoverflow.com
Martin Smith
Esto no agrega nada nuevo a otras respuestas, es un método manual, no puede ser programado, y dice que es "la forma correcta" ..
Andre Figueiredo
12

La solución de Hoodaticus fue perfecta, gracias, pero también necesitaba que se volviera a ejecutar y encontré esta forma de verificar si se había hecho ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END
Dave
fuente
7

Hay dos escenarios en los que se puede cambiar el valor predeterminado de una columna,

  1. A la hora de crear mesa
  2. Modificar columna existente para una tabla existente.

  1. A la hora de crear tabla / crear nueva columna.

Consulta

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Modificar columna existente para una tabla existente

En este caso, mi servidor SQL no permite modificar el valor de restricción predeterminado existente. Por lo tanto, para cambiar el valor predeterminado, necesitamos eliminar la restricción predeterminada generada por el sistema existente o generada por el usuario. Y después de ese valor predeterminado se puede establecer para una columna en particular.

Sigue algunos pasos:

  1. Enumere todas las restricciones de valor predeterminado existentes para las columnas.

Ejecute este procedimiento de base de datos del sistema, toma el nombre de la tabla como parámetro. Devuelve la lista de todas las restricciones para todas las columnas dentro de la tabla.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Descarte la restricción predeterminada existente para una columna.

Sintaxis:

alter table 'table_name' drop constraint 'constraint_name'
  1. Agregue una nueva restricción de valor predeterminado para esa columna:

Sintaxis:

alter table 'table_name' add default 'default_value' for 'column_name'

salud @!!!

Sunil Sharma
fuente
5

en caso de que ya exista una restricción con su nombre predeterminado:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;
tibx
fuente
4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]
steave
fuente
4

Puede usar la siguiente sintaxis. Para obtener más información, consulte esta pregunta y sus respuestas: Agregue una columna con un valor predeterminado a una tabla existente en SQL Server

Sintaxis:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Ejemplo:

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

De otra manera :

Haga clic derecho en la tabla y haga clic en Diseño, luego haga clic en la columna que desea establecer el valor predeterminado.

Luego, en la parte inferior de la página, agregue un valor predeterminado o enlace: algo como '1' para la cadena o 1 para int.

Mohamad Reza Shahrestani
fuente
3

Acabo de encontrar 3 pasos simples para modificar la columna ya existente que antes era nula

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 
David Fawzy
fuente
3

Primera caída de restricciones

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

Segundo crear valor predeterminado

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]
Mise
fuente
2

Intenta seguir el comando;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address
Hasna Ashraf
fuente
1

Al igual que la respuesta de Yuck con un cheque para permitir que el script se ejecute más de una vez sin error. (menos código / cadenas personalizadas que usar information_schema.columns)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
ScottFoster1000
fuente