Come impostare un valore predefinito per una colonna esistente


375

Questo non funziona in SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

L'errore è:

Sintassi errata vicino alla parola chiave "SET".

Che cosa sto facendo di sbagliato?


1
Cosa hai letto di MSDN ALTER TABLE ... msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn



1
Questa è la sintassi di mysql.
Benjamin Goodacre,

perché non tutti possono attenersi a uno standard? (non è una vera domanda, tutti si riferiscono a microsoft, mysql o altri fornitori). esiste un modo ansi / iso standard per farlo?
joedotnot

Risposte:


566

Questo funzionerà in SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
+1 per specificare un nome di vincolo, quindi SQL Server non ne crea uno casuale.
HardCode,

36
MSSQL è strano per chiamare i valori predefiniti "vincoli". Semmai, sono rilassamenti ; l' opposto di un vincolo! Rendono più valide, non meno.
Roman Starkov,

4
Non è strano se si pensa in modo alternativo come: il vincolo predefinito impedisce a MSSQL di generare un errore se non si specifica la colonna. Quindi non è un vincolo per l'utente, ma è un vincolo per MSSQL.
Jonny Piazzi,

4
Funziona solo se non esiste un vincolo predefinito esistente nella colonna.
pmcilreavy,

4
@fallenidol Funziona solo se non esiste un vincolo predefinito esistente nella colonna. Bene, perché per definizione non puoi avere più di un valore predefinito ...
Yuck,

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Funziona in MSSQL, ma ha lo svantaggio di non nominare il vincolo che crea dietro le quinte (vedi la risposta più votata sopra).
Contango,

10
@Contango Penso sia meglio non preoccuparsi di nominare ogni singolo vincolo sull'offchance di cui hai bisogno per modificarne uno. Scrivi semplicemente una procedura per eliminare automaticamente i vincoli con nome e non dovrai mai più nominarne uno + puoi occuparti di tutti gli altri senza nome
JonnyRaa,

3
@Jonny Leeds. Buon punto. Mi piace anche nominare i vincoli, poiché è una buona documentazione per chiunque cerchi di modificare (o semplicemente capire) lo schema del database. Questo è meno importante se uno è un operatore solista che lavora in una squadra di uno.
Contango,

1
(EESH! Mi dispiace per la mancanza di feed di riga - incollati di seguito per chiarezza!) Avevo bisogno che fosse ri-eseguibile e ho trovato questo modo per verificare se fosse già stato fatto ... SE ESISTE (SELEZIONA * DA information_schema.columns DOVE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) INIZIA ALTER TABLE [myDBO]. [myTable] AGGIUNGI DEFAULT 0 FOR [myColumn] END
Dave

4
Se esiste solo un vincolo predefinito ... perché devi nominarlo? Sembra che altri motori di database forniscano la sintassi per aggiungere, aggiornare, rimuovere il valore predefinito per una colonna senza un nome diverso dal nome della colonna, il che ha senso. Il codice sopra riportato non riesce, tra l'altro, se esiste già un valore predefinito. È ridicolo che SQL Server richieda un join complesso rispetto a una tabella di sistema solo per identificare il nome del vincolo predefinito, il che non dovrebbe essere necessario perché può esserci un solo vincolo predefinito su una colonna.
Triynko,

51

non puoi usare alter column per questo, usa invece add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
non so perché questa risposta non ottenga voti. È esattamente lo stesso di quello precedente ed è stato risposto in precedenza ...
spankmaster79,

30

Il modo corretto per farlo è il seguente:

  1. Esegui il comando:

    sp_help [table name] 
  2. Copia il nome del file CONSTRAINT.

  3. Rilascia il DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Esegui il comando seguente:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com è solo in inglese. Il sito portoghese è pt.stackoverflow.com
Martin Smith,

Questo non aggiunge nulla di nuovo ad altre risposte, è un metodo manuale - non può essere scritto e indica "il modo corretto" ..
Andre Figueiredo,

12

La soluzione di Hoodaticus era perfetta, grazie, ma avevo anche bisogno che fosse ri-eseguibile e ho trovato questo modo per verificare se fosse stata fatta ...

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

7

Esistono due scenari in cui è possibile modificare il valore predefinito per una colonna,

  1. Al momento della creazione della tabella
  2. Modifica la colonna esistente per una tabella esistente.

  1. Al momento della creazione della tabella / creazione di una nuova colonna.

domanda

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Modifica la colonna esistente per una tabella esistente

In questo caso il mio server SQL non consente di modificare il valore di vincolo predefinito esistente. Pertanto, per modificare il valore predefinito è necessario eliminare il vincolo predefinito generato dal sistema o generato dall'utente. E dopo quel valore predefinito può essere impostato per una particolare colonna.

Segui alcuni passaggi:

  1. Elencare tutti i vincoli di valore predefiniti esistenti per le colonne.

Eseguire questa procedura del database di sistema, accetta il nome della tabella come parametro. Restituisce un elenco di tutti i vincoli per tutte le colonne all'interno della tabella.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Elimina il vincolo predefinito esistente per una colonna.

Sintassi:

alter table 'table_name' drop constraint 'constraint_name'
  1. Aggiungi un nuovo vincolo di valore predefinito per quella colonna:

Sintassi:

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

Saluti @!!!


5

nel caso in cui esista già una limitazione con il suo nome predefinito:

-- 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;

4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

4

È possibile utilizzare la sintassi seguente, per ulteriori informazioni, consultare questa domanda e risposte: Aggiungere una colonna con un valore predefinito a una tabella esistente in SQL Server

Sintassi:

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

Esempio :

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.

Un altro modo :

Fare clic con il tasto destro sulla tabella e fare clic su Design, quindi fare clic sulla colonna per cui si desidera impostare il valore predefinito.

Quindi in fondo alla pagina aggiungi un valore o un'associazione di default: qualcosa come '1' per stringa o 1 per int.


3

Ho appena trovato 3 semplici passaggi per modificare la colonna già esistente che prima era nulla

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 

3

Vincoli del primo rilascio

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)

In secondo luogo creare il valore predefinito

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

2

Prova a seguire il comando;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

Come la risposta di Yuck con un segno di spunta per consentire l'esecuzione dello script più di una volta senza errori. (meno stringhe di codice / personalizzate rispetto all'utilizzo di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.