Come posso aggiungere una colonna con un valore predefinito a una tabella esistente in SQL Server 2000 / SQL Server 2005 ?
Come posso aggiungere una colonna con un valore predefinito a una tabella esistente in SQL Server 2000 / SQL Server 2005 ?
Risposte:
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 vincolo facoltativo:
se si lascia fuori, CONSTRAINT D_SomeTable_SomeCol
SQL Server genererà automaticamente
un Contraint di default con un nome divertente come:DF__SomeTa__SomeC__4FB7FEF6
Opzionale con-Valori Dichiarazione:
L' WITH VALUES
è necessaria solo quando la colonna è Nullable
e si desidera che il valore predefinito utilizzato per le schede esistenti.
Se la tua colonna lo è NOT NULL
, utilizzerà automaticamente il valore predefinito
per tutti i record esistenti, indipendentemente dal fatto che tu lo specifichi WITH VALUES
o meno.
Funzionamento degli inserti con un vincolo predefinito:
se si inserisce un record SomeTable
e non si specifica SomeCol
il valore, verrà impostato su Predefinito 0
.
Se si inserisce un record e si specifica SomeCol
il valore come NULL
(e la colonna consente valori null),
il vincolo predefinito non verrà utilizzato e NULL
verrà inserito come valore.
Le note si basavano sul fantastico feedback di tutti di seguito.
Un ringraziamento speciale a:
@Yatrix, @WalterStabosz, @YahooSerious e @StackMan per i loro commenti.
NOT NULL
. Prova questo: 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;
vedrai 2 valori NULL per la colonna b
.
WITH VALUES
per aggiornare le righe nullable esistenti. Vedere MSDN : "Se la colonna aggiunta consente valori null ed WITH VALUES
è specificata, il valore predefinito viene archiviato nella nuova colonna, aggiunta alle righe esistenti."
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
L'inclusione di DEFAULT riempie la colonna nelle righe esistenti con il valore predefinito, quindi il vincolo NOT NULL non viene violato.
Quando si aggiunge una colonna nullable , WITH VALUES
si assicurerà 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
DEFAULT
vincolo abbia sempre un valore, ovvero non sia NULL, anche se NOT NULL
non è specificato.
BIT
tipo di dati, stavo parlando di questa particolare BIT
colonna . Guarda la risposta, la colonna è dichiarata come NOT NULL
.
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
Fai attenzione quando la colonna che stai aggiungendo ha un NOT NULL
vincolo, ma non ha un DEFAULT
vincolo (valore). In ALTER TABLE
tal caso, l'istruzione avrà esito negativo se la tabella contiene righe. La soluzione è rimuovere il NOT NULL
vincolo dalla nuova colonna o fornire un DEFAULT
vincolo per esso.
Se si desidera aggiungere più colonne, è possibile 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
Uso:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Riferimento: ALTER TABLE (Transact-SQL) (MSDN)
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.
Di seguito è riportato uno script SQL molto più completo per aggiungere una colonna con un valore predefinito, incluso il controllo della presenza della colonna prima di aggiungerla, inoltre il controllo del vincolo e la sua eliminazione, se presente. Questo script nomina anche il vincolo in modo da poter avere una bella convenzione di denominazione (mi piace DF_) e in caso contrario 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.
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 utilizzare SQL Server Management Studio, puoi anche fare clic con il pulsante destro del mouse sulla tabella nel menu Progettazione, impostando il valore predefinito su 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 SQL Server 2008-R2, vado in modalità progettazione - in un database di prova - e aggiungo le mie due colonne usando il designer e ho fatto le impostazioni con la GUI, e poi il famigerato Right-Clickdà l'opzione " Genera script di modifica "!
Bang up apre una piccola finestra con, avete indovinato, lo script di modifica garantito per funzionare correttamente formattato. Premi il pulsante facile.
In alternativa, puoi aggiungere un valore predefinito senza dover assegnare un nome esplicito al vincolo:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Se si verificano problemi con i vincoli predefiniti esistenti durante la creazione di questo vincolo, è possibile rimuoverli mediante:
alter table [schema].[tablename] drop constraint [constraintname]
Questo può essere fatto anche nella GUI di SSMS. Mostro una data predefinita di seguito, ma il valore predefinito può essere qualunque, ovviamente.
(getdate())
o abc
o 0
qualsiasi valore desiderato nel campo Valore predefinito o Binding come mostrato di seguito:ALTER TABLE ADD ColumnName {Column_Type} Constraint
L'articolo MSDN ALTER TABLE (Transact-SQL) contiene tutta la sintassi della tabella alter.
Esempio:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Innanzitutto crea una tabella con nome studente:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Aggiungi una colonna ad essa:
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.
Questo ha molte risposte, ma sento la necessità di aggiungere questo metodo esteso. 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 farà sarà aggiungere la colonna come campo nullable e con il valore predefinito, aggiornare tutti i campi al valore predefinito (oppure è possibile assegnare valori più significativi), e infine cambierà la colonna in NOT NULL.
Il motivo è se aggiorni una tabella di grandi dimensioni e aggiungi un nuovo campo non nullo che deve scrivere su ogni singola riga e con ciò bloccherà l'intera tabella man mano che 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 fare tutto in una frase bloccherà una delle nostre tabelle più attive per 4-8 minuti e abbastanza spesso ho interrotto il processo. Questo metodo di solito ogni parte richiede solo pochi secondi e provoca un blocco minimo.
Inoltre, se hai una tabella nell'area di miliardi di righe, vale la pena raggruppare l'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
Prova questo
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Modifica tabella + Aggiungi colonna + Valore predefinito ID univoco
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
controllo prima di provare a modificare la tabella. Ottima soluzione Qualche commento aggiuntivo su come funziona lo renderebbe ancora più utile.
--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 desidera farlo incrementare automaticamente, allora:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
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 si desidera aggiungere vincoli, allora:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Questo può essere fatto con il seguente codice.
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
Prova con la query seguente:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Ciò aggiungerà una nuova colonna nella tabella.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
Da questa query è possibile aggiungere una colonna di tipo di dati intero con valore predefinito 0.
Bene, ora ho alcune modifiche alla mia risposta precedente. Ho notato che nessuna delle risposte menzionate IF NOT EXISTS
. Quindi fornirò una nuova soluzione in quanto ho riscontrato alcuni problemi nel modificare 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
Ecco TaskSheet
il nome particolare della tabella ed IsBilledToClient
è la nuova colonna che si intende inserire e 1
il valore predefinito. Ciò significa che nella nuova colonna quale sarà il valore delle righe esistenti, quindi uno verrà impostato automaticamente lì. Tuttavia, puoi cambiare come desideri con il rispetto del tipo di colonna come ho usatoBIT
, quindi ho inserito il valore predefinito 1.
Suggerisco il sistema precedente, perché ho riscontrato un problema. Quindi qual'è il problema? Il problema è che se la IsBilledToClient
colonna esiste nella tabella della tabella, se si esegue solo la parte del codice fornita di seguito, verrà visualizzato un errore nel generatore di query del server SQL. Ma se non esiste, 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]