Jak mogę dodać kolumnę z wartością domyślną do istniejącej tabeli w SQL Server 2000 / SQL Server 2005 ?
Jak mogę dodać kolumnę z wartością domyślną do istniejącej tabeli w SQL Server 2000 / SQL Server 2005 ?
Odpowiedzi:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
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.
Opcjonalna nazwa ograniczenia: w
przypadku CONSTRAINT D_SomeTable_SomeCol
pominięcia
program SQL Server automatycznie wygeneruje ograniczenie domyślne ze śmieszną nazwą, taką jak:DF__SomeTa__SomeC__4FB7FEF6
Opcjonalnie Oświadczenie wartościach: jest potrzebna, gdy kolumna jest Nullable tylko
i chcesz domyślna wartość używana do istniejących rekordów.
Jeśli twoja kolumna jest , wówczas automatycznie użyje wartości domyślnej
dla wszystkich istniejących rekordów, niezależnie od tego, czy podasz tę wartość, czy nie.WITH VALUES
NOT NULL
WITH VALUES
Jak praca Wstawki z domyślnym-constraint:
Po włożeniu do rekordu SomeTable
i czy nie Określ SomeCol
„s wartość, to będzie domyślnie 0
.
Jeśli wstawić rekord i określ SomeCol
„s wartość jako NULL
(a kolumna pozwala null),
a następnie Default-Ograniczenie będzie nie być używany i NULL
zostanie wstawiony jako wartość.
Notatki oparto na świetnych opiniach wszystkich poniżej.
Specjalne podziękowania dla:
@Yatrix, @WalterStabosz, @YahooSerious i @StackMan za komentarze.
NOT NULL
. Spróbuj tego: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
Zobaczysz 2 wartości NULL dla kolumny b
.
WITH VALUES
do aktualizowania istniejących zerowalnych wierszy. Patrz MSDN : „Jeśli dodana kolumna dopuszcza wartości zerowe i WITH VALUES
jest określona, wartość domyślna jest zapisywana w nowej kolumnie, dodawanej do istniejących wierszy.”
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Włączenie DOMYŚLNE wypełnia kolumnę w istniejących wierszach wartością domyślną, więc ograniczenie NOT NULL nie zostanie naruszone.
Dodając kolumnę zerowalną , WITH VALUES
upewni się, że do istniejących wierszy zostanie zastosowana określona wartość DOMYŚLNA:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
ograniczeniem zawsze będzie miała wartość - to znaczy nie będzie NULL, nawet jeśli NOT NULL
nie jest określona.
BIT
danych, mówiłem o tej konkretnej BIT
kolumnie . Spójrz na odpowiedź, kolumna jest zadeklarowana jako NOT NULL
.
Uważaj, gdy dodawana kolumna ma NOT NULL
ograniczenie, ale nie ma DEFAULT
ograniczenia (wartości). W ALTER TABLE
takim przypadku instrukcja zakończy się niepowodzeniem, jeśli tabela zawiera wiersze. Rozwiązaniem jest albo usunięcie NOT NULL
ograniczenia z nowej kolumny, albo zapewnienie DEFAULT
dla niego ograniczenia.
Jeśli chcesz dodać wiele kolumn, możesz to zrobić na przykład:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
Posługiwać się:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Odniesienie: ALTER TABLE (Transact-SQL) (MSDN)
Aby dodać kolumnę do istniejącej tabeli bazy danych z wartością domyślną, możemy użyć:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Oto inny sposób dodania kolumny do istniejącej tabeli bazy danych z wartością domyślną.
O wiele dokładniejszy skrypt SQL służący do dodawania kolumny z wartością domyślną znajduje się poniżej, w tym sprawdzenie, czy kolumna istnieje przed dodaniem jej, także sprawdzenie ograniczenia i usunięcie go, jeśli taki istnieje. Ten skrypt nazywa również ograniczenie, dzięki czemu możemy mieć przyjemną konwencję nazewnictwa (lubię DF_), a jeśli nie, SQL da nam ograniczenie o nazwie, która ma losowo wygenerowaną liczbę; więc miło jest móc nazwać ograniczenie.
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
Są dwa sposoby dodania kolumny do istniejącej tabeli bazy danych z wartością domyślną.
Możesz to zrobić za pomocą T-SQL w następujący sposób.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Oprócz korzystania z SQL Server Management Studio można także kliknąć prawym przyciskiem myszy tabelę w menu Projekt, ustawiając wartość domyślną na tabelę.
Ponadto, jeśli chcesz dodać tę samą kolumnę (jeśli nie istnieje) do wszystkich tabel w bazie danych, użyj:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
W SQL Server 2008-R2 przechodzę do trybu projektowania - w testowej bazie danych - i dodaję dwie kolumny za pomocą projektanta i dokonałem ustawień za pomocą GUI, a następnie niesławny Right-Clickdaje opcję „ Generuj skrypt zmian ”!
Bang up wyskakuje małe okno, jak się domyślacie, odpowiednio sformatowany skrypt zmiany gwarantowanej do pracy. Naciśnij łatwy przycisk.
Możesz też dodać wartość domyślną bez konieczności jawnego nazwania ograniczenia:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Jeśli masz problem z istniejącymi ograniczeniami domyślnymi podczas tworzenia tego ograniczenia, możesz je usunąć:
alter table [schema].[tablename] drop constraint [constraintname]
Można to zrobić również w graficznym interfejsie SSMS. Poniżej pokazuję domyślną datę, ale wartość domyślna może oczywiście być dowolna.
(getdate())
lub abc
lub 0
inną wartość, którą chcesz w polu Wartość domyślna lub Powiązanie, jak pokazano poniżej:ALTER TABLE ADD ColumnName {Column_Type} Constraint
Artykuł MSDN ALTER TABLE (Transact-SQL) zawiera całą składnię tabeli zmian.
Przykład:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Najpierw utwórz tabelę z imieniem uczeń:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Dodaj do niej jedną kolumnę:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
Tabela zostanie utworzona, a kolumna zostanie dodana do istniejącej tabeli z wartością domyślną.
To daje wiele odpowiedzi, ale czuję potrzebę dodania tej rozszerzonej metody. Wydaje się to znacznie dłuższe, ale jest niezwykle przydatne, jeśli dodajesz pole NOT NULL do tabeli z milionami wierszy w aktywnej bazie danych.
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
W ten sposób dodasz kolumnę jako pole zerowalne i przy wartości domyślnej zaktualizujesz wszystkie pola do wartości domyślnej (lub możesz przypisać bardziej znaczące wartości), a na koniec zmieni kolumnę na NIE NULL.
Powodem tego jest to, że jeśli zaktualizujesz tabelę na dużą skalę i dodasz nowe niepuste pole, musi ono zapisać w każdym wierszu, a tym samym zablokuje całą tabelę podczas dodawania kolumny, a następnie zapisywania wszystkich wartości.
Ta metoda doda kolumnę zerowalną, która sama działa o wiele szybciej, a następnie wypełni dane przed ustawieniem statusu różnego od zera.
Przekonałem się, że zrobienie wszystkiego w jednym oświadczeniu zablokuje jedną z naszych bardziej aktywnych tabel na 4-8 minut i dość często zabijałem ten proces. Ta metoda zazwyczaj zajmuje tylko kilka sekund i powoduje minimalne blokowanie.
Ponadto, jeśli masz tabelę w obszarze miliardów wierszy, warto podzielić ją na części tak:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
Spróbuj tego
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Zmień tabelę + Dodaj kolumnę + Unikalny identyfikator wartości domyślnej
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
IF NOT EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
NOT EXISTS
czek przed próbą zmiany tabeli. Bardzo dobre rozwiązanie. Dodatkowe komentarze na temat tego, jak to działa, uczynią go jeszcze bardziej przydatnym.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Dodaj nową kolumnę do tabeli:
ALTER TABLE [table]
ADD Column1 Datatype
Na przykład,
ALTER TABLE [test]
ADD ID Int
Jeśli użytkownik chce ustawić automatyczne zwiększanie, wówczas:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
To jest dla SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Przykład:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Jeśli chcesz dodać ograniczenia, to:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Można to zrobić za pomocą poniższego kodu.
CREATE TABLE TestTable
(FirstCol INT NOT NULL)
GO
------------------------------
-- Option 1
------------------------------
-- Adding New Column
ALTER TABLE TestTable
ADD SecondCol INT
GO
-- Updating it with Default
UPDATE TestTable
SET SecondCol = 0
GO
-- Alter
ALTER TABLE TestTable
ALTER COLUMN SecondCol INT NOT NULL
GO
Wypróbuj poniższe zapytanie:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Spowoduje to dodanie nowej kolumny do tabeli.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Z tego zapytania możesz dodać kolumnę liczb całkowitych typu danych o wartości domyślnej 0.
Cóż, mam teraz modyfikację mojej poprzedniej odpowiedzi. Zauważyłem, że żadna z wymienionych odpowiedzi nie została wymieniona IF NOT EXISTS
. Zamierzam więc przedstawić nowe rozwiązanie tego problemu, ponieważ miałem problemy z modyfikacją tabeli.
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO
Oto TaskSheet
konkretna nazwa tabeli i IsBilledToClient
nowa kolumna, którą zamierzasz wstawić, oraz 1
wartość domyślna. Oznacza to w nowej kolumnie, jaka będzie wartość istniejących wierszy, dlatego jeden zostanie tam ustawiony automatycznie. Możesz jednak dowolnie zmieniać, uwzględniając typ kolumny, tak jak jaBIT
, więc ustawiłem wartość domyślną 1.
Sugeruję powyższy system, ponieważ napotkałem problem. Więc jaki jest problem? Problem polega na tym, że jeśli IsBilledToClient
kolumna istnieje w tabeli, to jeśli wykonasz tylko część kodu podaną poniżej, zobaczysz błąd w kreatorze zapytań serwera SQL. Ale jeśli nie istnieje, to po raz pierwszy nie będzie błędu podczas wykonywania.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]