Jak ustawić wartość domyślną dla istniejącej kolumny

375

To nie działa w SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Błąd jest następujący:

Niepoprawna składnia w pobliżu słowa kluczowego „SET”.

Co ja robię źle?

Nakul Chaudhary
źródło
1
Co powiedziałeś o MSDN ALTER TABLE ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn
1
To jest składnia mysql.
Benjamin Goodacre,
dlaczego nie wszyscy mogą trzymać się standardu? (nie jest to prawdziwe pytanie, wszyscy odnoszą się do Microsoft, MySQL lub innych dostawców). czy istnieje nawet standardowy sposób na to?
joedotnot

Odpowiedzi:

566

Będzie to działać w SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
Fuj
źródło
62
+1 za określenie nazwy ograniczenia, aby SQL Server nie tworzył losowej nazwy.
HardCode
36
MSSQL jest dziwny w nazywaniu wartości domyślnych „ograniczeniami”. Jeśli już, to są relaksacje ; naprzeciwko z przymusu! Sprawiają, że więcej rzeczy jest ważnych, a nie mniej.
Roman Starkov
4
Nie jest to dziwne, jeśli myślisz w alternatywny sposób: Domyślne ograniczenie zapobiega generowaniu przez MSSQL błędu, jeśli nie określisz kolumny. Nie jest to więc ograniczenie dla użytkownika, ale ograniczenie dla MSSQL.
Jonny Piazzi
4
Działa to tylko wtedy, gdy nie ma istniejącego domyślnego ograniczenia w kolumnie.
pmcilreavy 18.08.16
4
@fallenidol Działa to tylko wtedy, gdy nie ma istniejącego domyślnego ograniczenia dla kolumny. Tak, ponieważ z definicji nie możesz mieć więcej niż jedną wartość domyślną ...
Fuj
165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn
hoodaticus
źródło
3
Działa to w MSSQL, ale ma tę wadę, że nie określa ograniczenia, które tworzy za kulisami (patrz wyżej głosowana odpowiedź powyżej).
Contango,
10
@Contango Wydaje mi się, że lepiej nie zawracać sobie głowy nazwaniem każdego ograniczenia na potrzeby zmiany jednego z nich. Po prostu napisz procedurę usuwania automatycznie nazwanych ograniczeń i już nigdy nie będziesz musiał ich nazywać + możesz sobie poradzić ze wszystkimi innymi bezimiennymi
JonnyRaa
3
@Jonny Leeds. Słuszna uwaga. Lubię też nazywać ograniczenia, ponieważ jest to dobra dokumentacja dla każdego, kto próbuje zmodyfikować (lub po prostu zrozumieć) schemat bazy danych. Jest to mniej ważne, jeśli ktoś jest operatorem solo i pracuje w jednym zespole.
Contango
1
(EESH! Przepraszam za brak kanałów liniowych - wklejonych poniżej dla jasności!) Potrzebowałem go do ponownego uruchomienia i znalazłem ten sposób, aby sprawdzić, czy to już zostało zrobione ... JEŚLI ISTNIEJE (WYBIERZ * Z information_schema.columns GDZIE nazwa_tabeli = „mojaTabela” ORAZ nazwa_kolumny = „moja_kolumna” ORAZ tabela_symma = „mojaDBO” ORAZ domyślna_funkcja jest NULL) POCZĄTEK ALTER TABELI [mojaDBO]. [mojaTabela] DODAJ DOMYŚLNE 0 DLA [moja_kolumna] KONIEC
Dave
4
Jeśli istnieje tylko jedno domyślne ograniczenie ... dlaczego musisz je nazwać? Wygląda na to, że inne silniki baz danych zapewniają składnię do dodawania, aktualizowania, usuwania domyślnej wartości dla kolumny bez nazwy innej niż nazwa kolumny, co ma sens. Powyższy kod nie powiedzie się, jeśli jest już ustawiony domyślny. To niedorzeczne, że SQL Server wymaga złożonego łączenia z tabelą systemową tylko w celu zidentyfikowania nazwy domyślnego ograniczenia, co nie powinno być konieczne, ponieważ w kolumnie może istnieć tylko jedno domyślne ograniczenie.
Triynko,
51

nie można do tego użyć kolumny alter, zamiast tego należy użyć add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn
Carlos Quintanilla
źródło
9
nie wiem, dlaczego ta odpowiedź nie zyskuje aprobaty. Jest dokładnie taki sam jak poprzedni i na co wcześniej odpowiedziano ...
spankmaster79
30

Prawidłowy sposób to zrobić:

  1. Uruchom polecenie:

    sp_help [table name] 
  2. Skopiuj nazwę CONSTRAINT.

  3. Upuść DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Uruchom poniższe polecenie:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
użytkownik3310402
źródło
4
StackOverflow.com jest tylko w języku angielskim. Stroną
Martin Smith
Nie dodaje to nic nowego do innych odpowiedzi, jest metodą ręczną - nie można jej napisać w skrypcie i stwierdza, że ​​jest to „właściwy sposób” ..
Andre Figueiredo
12

Dziękuję, rozwiązanie Hoodaticus było idealne, ale potrzebowałem go również do ponownego uruchomienia i znalazłem ten sposób, aby sprawdzić, czy zostało zrobione ...

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
źródło
7

Istnieją dwa scenariusze, w których można zmienić wartość domyślną dla kolumny:

  1. W momencie tworzenia tabeli
  2. Zmodyfikuj istniejącą kolumnę dla istniejącej tabeli.

  1. W momencie tworzenia tabeli / tworzenia nowej kolumny.

Pytanie

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Zmodyfikuj istniejącą kolumnę dla istniejącej tabeli

W takim przypadku mój serwer SQL nie pozwala modyfikować istniejącej domyślnej wartości ograniczenia. Aby zmienić wartość domyślną, musimy usunąć istniejące ograniczenie wygenerowane przez system lub domyślne ograniczenie wygenerowane przez użytkownika. Po tym można ustawić wartość domyślną dla konkretnej kolumny.

Wykonaj kilka kroków:

  1. Wyświetl wszystkie istniejące ograniczenia wartości domyślnych dla kolumn.

Wykonaj tę procedurę systemowej bazy danych, jako parametr przyjmuje nazwę tabeli. Zwraca listę wszystkich ograniczeń dla wszystkich kolumn w tabeli.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Usuń istniejące domyślne ograniczenie dla kolumny.

Składnia:

alter table 'table_name' drop constraint 'constraint_name'
  1. Dodaj nowe ograniczenie wartości domyślnej dla tej kolumny:

Składnia:

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

Twoje zdrowie @!!!

Sunil Sharma
źródło
5

w przypadku, gdy istnieje już ograniczenie z jego domyślną nazwą:

-- 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
źródło
4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]
parować
źródło
4

Możesz użyć następującej składni. Aby uzyskać więcej informacji, zobacz to pytanie i odpowiedzi: Dodaj kolumnę z wartością domyślną do istniejącej tabeli w programie SQL Server

Składnia:

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

Przykład:

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.

Inny sposób :

Kliknij prawym przyciskiem myszy tabelę i kliknij opcję Projekt, a następnie kliknij kolumnę, w której chcesz ustawić wartość domyślną.

Następnie na dole strony dodaj wartość domyślną lub powiązanie: coś w rodzaju „1” dla ciągu lub 1 dla int.

Mohamad Reza Shahrestani
źródło
3

Właśnie znalazłem 3 proste kroki, aby zmienić już istniejącą kolumnę, która wcześniej była pusta

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
źródło
3

Ograniczenia pierwszego zrzutu

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)

Następnie utwórz wartość domyślną

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]
Mise
źródło
2

Spróbuj wykonać polecenie;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address
Hasna Ashraf
źródło
1

Podobnie jak odpowiedź Yucka z zaznaczeniem, aby skrypt mógł być uruchamiany więcej niż jeden raz bez błędów. (mniej kodów / ciągów niestandardowych niż przy użyciu 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
źródło