Jak dodać kolumnę do tabeli SQL Server z domyślną wartością równą wartości istniejącej kolumny?
Wypróbowałem tę instrukcję T-SQL:
ALTER TABLE tablename
ADD newcolumn type NOT NULL DEFAULT (oldcolumn)
ale daje błąd:
W tym kontekście nazwa „stara kolumna” jest niedozwolona. Prawidłowe wyrażenia to stałe, stałe wyrażenia i (w niektórych kontekstach) zmienne. Nazwy kolumn są niedozwolone.
sql
sql-server-2008
diddos
źródło
źródło
UPDATE
Obawiam się, że musisz to zrobić osobno .Odpowiedzi:
Spróbuj tego:
ALTER TABLE tablename ADD newcolumn type NOT NULL DEFAULT (0) Go Update tablename SET newcolumn = oldcolumn Where newcolumn = 0 Go
źródło
Nie lubię ich bardzo, ale oto jak można to zrobić za pomocą
AFTER INSERT
spustu:CREATE TRIGGER TableX_AfterInsert_TRG ON TableX AFTER INSERT AS UPDATE TableX AS t SET t.newcolumn = t.oldcolumn FROM Inserted AS i WHERE t.PK = i.PK ; -- where PK is the PRIMARY KEY of the table
źródło
AFTER INSERT
Podejście wyzwalania obejmuje napowietrznych ze względu na dodatkowymUPDATE
oświadczeniu. Sugeruję użycieINSTEAD OF INSERT
wyzwalacza w następujący sposób:CREATE TRIGGER tablename_on_insert ON tablename INSTEAD OF INSERT AS INSERT INTO tablename (oldcolumn, newcolumn) SELECT oldcolumn, ISNULL(newcolumn, oldcolumn) FROM inserted
Nie działa to jednak, jeśli
oldcolumn
jest to kolumna z automatyczną tożsamością.źródło
INSTEAD OF
wyzwalacze również nie działają podczas korzystania z tabel czasowych:SYSTEM_VERSIONING = ON
Aby rozszerzyć odpowiedź Kapila i uniknąć niechcianego domyślnego ograniczenia, spróbuj tego:
ALTER TABLE tablename ADD newcolumn type NOT NULL CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN DEFAULT -9999 Go Update tablename SET newcolumn = oldcolumn Go ALTER TABLE tablename DROP CONSTRAINT DF_TMP_TABLENAME_NEWCOLUMN Go
Zastąp -9999 przez „noData”, jeśli typ to varchar, nvarchar, datetime, ... lub dowolne zgodne dane dla innych typów: określona wartość nie ma znaczenia, zostanie wyczyszczona przez drugą instrukcję.
źródło
Możesz użyć kolumny obliczonej, aby wstawić nową kolumnę do tabeli na podstawie istniejącej wartości kolumny
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn) PERSISTED;
LUB, jeśli chcesz wprowadzić zmiany w wartości na podstawie istniejącej wartości kolumny, użyj
ALTER TABLE dbo.TableName ADD NewColumn AS (OldColumn * 1.5) PERSISTED;
źródło
W moim przypadku chcę dodać nową unikalną kolumnę o nazwie CODE, która nie jest pusta, ale nie wiem, jaka jest wartość w czasie tworzenia. Ustawiam wartość domyślną, pobierając wartość domyślną z NewID (), a następnie aktualizuję ją później.
ALTER TABLE [WIDGET] ADD [CODE] CHAR(5) NOT NULL DEFAULT(SUBSTRING(CONVERT(CHAR(36), NEWID()), 1, 5)) ALTER TABLE [dbo].[WIDGET] WITH CHECK ADD CONSTRAINT [UQ_WIDGET_CODE] UNIQUE ([CODE])
źródło
Myślę, że zadziała, jeśli użyjesz
Set Identity_Insert <TableName> OFF
i po wstawieniu instrukcji, którą napisałeś, po prostu użyjSet Identity_Insert <TableName> ON
.źródło