2013-03-21 14 views
24

Próbuję zmienić domyślną wartość kolumny za pomocą instrukcji SQL w SQL Server 2008. W wielu miejscach znalazłem sposób ustawiania wartości domyślnej podczas tworzenia tabeli/dodawania kolumna, ale nie jak ją ustawić/zmodyfikować, gdy kolumna już istnieje.Modyfikuj wartość domyślną w SQL Server

To co mogę używać, aby ustawić go na dodanie:

ALTER TABLE MyTable ADD MyColumn int NOT NULL DEFAULT 0 

I to działa, ale gdy próbuję go zmodyfikować później:

ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL DEFAULT -1 
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL SET DEFAULT -1 

Żaden z tych są składniowo poprawne, i nie znajduję składni, aby robić to, co udaje w dowolnym miejscu. Jedyną dostępną opcją jest dodanie nowej kolumny, skopiowanie wartości z poprzedniej kolumny, a następnie usunięcie poprzedniej kolumny i nowej kolumny w celu wprowadzenia zmiany, ale nie wydaje mi się to właściwe.

Czy istnieje sposób robienia tego, co chcę w jednym prostym zdaniu?

Dzięki.

Odpowiedz

45

Po dodaniu kolumny z wartością domyślną, co się dzieje, jest to, że nie jest to domyślne ograniczenie dodaje:

create table _temp 
(x int default 1) 

sp_help wynik:

constraint_type constraint_name 
DEFAULT on column x DF___temp__x__5A3B20F9 

Ta klauzula jest skrótem do tworzenia więzów. Jeżeli chcesz zmodyfikować domyślne dla już istniejącej kolumny, trzeba upuścić ograniczenie pierwszy:

alter table _temp drop constraint DF___temp__x__5A3B20F9 

a następnie utworzyć nową domyślną ograniczenia:

alter table _temp add constraint DF_temp_x default 2 for x 
+9

Dodałbym tylko, jak uzyskać nazwy ograniczeń do wyjaśnień: SELECT NAME FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID ("dbo.MyTable"); Po prostu to pomoże ci wiedzieć, które ograniczenie usunąć/dodać ponownie. –

+4

To wyraźnie pokazuje, dlaczego tak ważne jest ** jednoznaczne podanie ** swoich ograniczeń! Wyobraź sobie, że chcesz rzucić to ograniczenie ...o ile łatwiejsze jest, jeśli wiesz, że nazywa się 'DF_Temp_X' (zamiast wygenerowanego przez system' DF _____ temp__x__5A3B20F9') –

+3

@ Ruben.Canton: "sp_help TABLE_NAME" też to robi. –

10

Należy upuścić ograniczenie domyślne i dodawać nowe jak ten

alter table Mytable 
drop constraint <constraint name> 
go 
alter table MyTable 
add constraint df_MyTable_MyColumn default -1 for MyColumn 
go 

Korzystanie sp_helpconstraint MyTable dostać nazw przymusu

+0

Dostaję to teraz, na innych stronach, gdzie również mówię o przymusie, ale nie czytałem szczegółowo i nie patrzyłem na oświadczeniach myślałem, że odpowiada na coś innego. Dziękuję za wyjaśnienie. –

5

DEFAULT jest przeszkodą. Chcesz użyć ALTER TABLE ADD CONSTRAINT.

ALTER TABLE MyTable 
ADD CONSTRAINT <constraint name> 
DEFAULT -1 FOR MyColumn 

Musisz upuścić aktualny ograniczenie pierwsze, jak:

ALTER TABLE MyTable 
DROP CONSTRAINT <constraint name> 
22
DECLARE @Command nvarchar(max), @ConstaintName nvarchar(max), @TableName nvarchar(max),@ColumnName nvarchar(max) 
SET @TableName = 'TableName' 
SET @ColumnName ='ColumnName' 
SELECT @ConstaintName = name 
    FROM sys.default_constraints 
    WHERE parent_object_id = object_id(@TableName) 
     AND parent_column_id = columnproperty(object_id(@TableName), @ColumnName, 'ColumnId') 

SELECT @Command = 'ALTER TABLE '[email protected]+' drop constraint '+ @ConstaintName 

IF @Command IS NOT NULL 
BEGIN 
    EXECUTE sp_executeSQL @Command 
    SELECT @Command = 'ALTER TABLE '[email protected]+' ADD CONSTRAINT '[email protected]+' DEFAULT 1 FOR ' + @ColumnName 
    EXECUTE sp_executeSQL @Command 
END 
+5

Nie wiem, dlaczego zostało to odrzucone. To wydaje się być całkiem dobrym rozwiązaniem ... –

+2

@LukasEder Prawdopodobnie jako reakcja na ilość kodu SQL Server wymaga podania domyślnej wartości, gdy nazwa ograniczenia jest wygenerowana przez system, w porównaniu do np. PostgreSQL: ALTER TABLE Nazwa tabeli ALTER COLUMN ColumnName DROP DEFAULT; – MrBackend

0

dodać wartość domyślną dla kolumny, jeśli nie istnieje

DECLARE @defaultLock VARCHAR(100) 
SELECT @defaultLock = (SELECT object_definition(default_object_id) AS definition FROM sys.columns WHERE name = 'Lock' AND object_id = object_id('dbo.Positions')) 
    IF @defaultLock IS NULL 
     ALTER TABLE Positions ADD DEFAULT (0) FOR Lock 
Powiązane problemy