Come può essere aggiunta una colonna con un valore predefinito ad una tabella esistente in SQL Server 2000 / SQL Server 2005 ?
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.
Nome del vincolo facoltativo:
Se si omette CONSTRAINT D_SomeTable_SomeCol
, SQL Server si autogenererà
un Prescrizione di Prescrizione con un Nome divertente come: DF__SomeTa__SomeC__4FB7FEF6
Dichiarazione facoltativa con valori:
Il WITH VALUES
è necessario solo quando la colonna è Nullable
e si desidera il valore predefinito utilizzato per i record esistenti.
Se la colonna è NOT NULL
, utilizzerà automaticamente il valore predefinito
per tutti i record esistenti, indipendentemente dal fatto che si specifichi WITH VALUES
oppure no.
In che modo gli inserti funzionano con un vincolo predefinito:
Se si inserisce un record in SomeTable
e si fanonspecificare il valore SomeCol
, allora verrà impostato su 0
.
Se inserisci un recordeSpecifica il valore SomeCol
come NULL
(e la tua colonna consente null),
quindi il vincolo predefinito sarànone verrà usato NULL
come valore.
Le note erano basate sull'ottimo feedback di tutti di seguito.
Ringraziamenti speciali a:
@Yatrix, @WalterStabosz, @YahooSerious e @StackMan per i loro commenti.
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
L'inclusione diDEFAULTriempie la colonna in existing rows con il valore predefinito, quindi il vincolo NOT NULL non viene violato.
Quando aggiungi una colonna nullable, WITH VALUES
garantisce che il valore DEFAULT specifico venga applicato alle righe esistenti:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
ALTER TABLE <table name>
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name>
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Attenzione quando la colonna che stai aggiungendo ha un vincolo NOT NULL
, ma non ha un vincolo DEFAULT
(valore). L'istruzione ALTER TABLE
fallirà in quel caso se la tabella contiene delle righe. La soluzione è rimuovere il vincolo NOT NULL
dalla nuova colonna o fornire un vincolo DEFAULT
per questo.
La versione più semplice con solo due linee
ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
Uso:
-- Add a column with a default DateTime
-- to capture when each record is added.
ALTER TABLE myTableName
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())
GO
Se vuoi aggiungere più colonne puoi farlo in questo modo ad esempio:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
In SQL Server 2008-R2, vado nella modalità di progettazione - in un database di test - e aggiungo le mie due colonne usando il designer e ho apportato le impostazioni con la GUI, e quindi l'infame Right-Click dà l'opzione " Genera script di modifica "!
Bang up apre una piccola finestra con, avete indovinato, lo script di modifica garantita sul lavoro correttamente formattato. Premi il pulsante facile.
Uso:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Riferimento: ALTER TABLE (Transact-SQL) (MSDN)
Puoi fare la cosa con T-SQL nel modo seguente.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Oltre a poter utilizzare SQL Server Management Studio anche facendo clic con il pulsante destro del mouse nel menu Design, impostando il valore predefinito sulla tabella.
Inoltre, se si desidera aggiungere la stessa colonna (se non esiste) a tutte le tabelle nel database, utilizzare:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
In alternativa, è possibile aggiungere un valore predefinito senza dover esplicitamente denominare il vincolo:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Se si verifica un problema con i vincoli predefiniti esistenti durante la creazione di questo vincolo, possono essere rimossi da:
alter table [schema].[tablename] drop constraint [constraintname]
Per aggiungere una colonna a una tabella di database esistente con un valore predefinito, possiamo usare:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Ecco un altro modo per aggiungere una colonna a una tabella di database esistente con un valore predefinito.
Uno script SQL molto più approfondito per aggiungere una colonna con un valore predefinito è al di sotto che include il controllo se la colonna esiste prima di aggiungerla, anche se si verifica il vincolo e lo si elimina se ce n'è uno. Questo script nomina anche il vincolo in modo che possiamo avere una convenzione di denominazione Nice (mi piace DF_) e se non SQL ci darà un vincolo con un nome che ha un numero generato casualmente; quindi è bello poter nominare anche il vincolo.
-------------------------------------------------------------------------
-- 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
Questi sono due modi per aggiungere una colonna a una tabella di database esistente con un valore predefinito.
ALTER TABLE ADD ColumnName {Column_Type} Constraint
L'articolo MSDN ALTER TABLE (Transact-SQL) ha tutta la sintassi di alter table.
Questo può essere fatto anche nella GUI SSMS. Io mostro una data di default sotto, ma il valore di default può essere qualunque cosa, ovviamente.
(getdate())
o abc
o 0
o qualsiasi valore desiderato nel campo Default Value o Binding come illustrato di seguito:Esempio:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Esempio:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Per prima cosa crea un tavolo con nome studente:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Aggiungi una colonna ad esso:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
La tabella viene creata e una colonna viene aggiunta a una tabella esistente con un valore predefinito.
SQL Server + Modifica tabella + Aggiungi colonna + Valore predefinito uniqueidentifier
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
Prova questo
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
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
Questo ha molte risposte, ma sento la necessità di aggiungere questo metodo esteso. Questo sembra molto più lungo, ma è estremamente utile se si aggiunge un campo NOT NULL a una tabella con milioni di righe in un database attivo.
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
Ciò che questo farà è aggiungere la colonna come campo nullable e con il valore predefinito, aggiornare tutti i campi al valore predefinito (oppure assegnare valori più significativi) e alla fine cambierà la colonna in NOT NULL.
La ragione di ciò è se si aggiorna una tabella di grandi dimensioni e si aggiunge un nuovo campo non nullo che deve scrivere su ogni singola riga e con la presente si bloccherà l'intera tabella mentre aggiunge la colonna e quindi scrive tutti i valori.
Questo metodo aggiungerà la colonna nullable che opera molto più velocemente da sola, quindi riempie i dati prima di impostare lo stato non nullo.
Ho scoperto che eseguire l'intera operazione in un'unica istruzione bloccherà uno dei nostri tavoli più attivi per 4-8 minuti e molto spesso ho ucciso il processo. Questo metodo richiede in genere ogni parte solo pochi secondi e causa un blocco minimo.
Inoltre, se si dispone di una tabella nell'area di miliardi di righe, potrebbe valere la pena di eseguire il batching dell'aggiornamento in questo modo:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Aggiungi una nuova colonna a una tabella:
ALTER TABLE [table]
ADD Column1 Datatype
Per esempio,
ALTER TABLE [test]
ADD ID Int
Se l'utente vuole farlo incrementare automaticamente, allora:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Questo può essere fatto con il codice seguente.
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
Bene, ora ho qualche modifica alla mia risposta precedente. Ho notato che nessuna delle risposte menzionate IF NOT EXISTS
. Quindi ne fornirò una nuova soluzione poiché ho riscontrato alcuni problemi nell'alterare la tabella.
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
Qui TaskSheet
è il nome della tabella particolare e IsBilledToClient
è la nuova colonna che stai per inserire e 1
il valore predefinito. Ciò significa che nella nuova colonna quale sarà il valore delle righe esistenti, quindi verrà impostato automaticamente lì. Tuttavia, puoi cambiare come desideri con il rispetto del tipo di colonna, come ho usato BIT
, quindi ho inserito il valore predefinito 1.
Suggerisco il sistema di cui sopra, perché ho avuto un problema. Quindi qual'è il problema? Il problema è che se la colonna IsBilledToClient
esiste nella tabella della tabella, se si esegue solo la parte del codice fornita di seguito, verrà visualizzato un errore nel generatore Query del server SQL. Ma se non esiste allora per la prima volta non ci saranno errori durante l'esecuzione.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Da questa query è possibile aggiungere una colonna di un intero tipo di dati con il valore predefinito 0.
Se il valore predefinito è Null, quindi:
New Column
Select Type
e Verifica la casella di controllo Allow NullsSave
Fatto!
Puoi usare questa query:
ALTER TABLE tableName ADD ColumnName datatype DEFAULT DefaultValue;
SQL Server + Modifica tabella + Aggiungi colonna + Valore predefinito uniqueidentifier ...
ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
Fare clic con il tasto destro del mouse sulla tabella, fare clic sotto il nome dell'ultima colonna e immettere le informazioni sulla colonna.
Quindi aggiungi un valore predefinito o un bind, qualcosa come "1" per stringa o 1 per int.
Questo è per SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Esempio:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Se vuoi aggiungere dei vincoli allora:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
passo 1. INIZIARE A MODIFICARE LA TABELLA CON AGGIUNTA UN CAMPO
alter table table_name add field field_name data_type
step-2 CREA DEFAULT
USE data_base_name;
GO
CREATE DEFAULT default_name AS 'default_value';
step-3 ALLORA DEVE ESEGUIRE QUESTA PROCEDURA
exec sp_bindefault 'default_name' , 'schema_name.table_name.field_name'
esempio -
USE master;
GO
EXEC sp_bindefault 'today', 'HumanResources.Employee.HireDate';
--Adding New Column with Default Value
ALTER TABLE TABLENAME
ADD COLUMNNAME DATATYPE NULL|NOT NULL DEFAULT (DEFAULT_VALUE)
OR
--Adding CONSTRAINT And Set Default Value on Column
ALTER TABLE TABLENAME ADD CONSTRAINT [CONSTRAINT_Name] DEFAULT
(DEFAULT_VALUE) FOR [COLUMNNAME]
ALTER TABLE Table1 ADD Col3 INT NOT NULL DEFAULT(0)
Prova con la seguente query:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Questo aggiungerà una nuova colonna nella tabella.