Comment puis-je ajouter une colonne avec une valeur par défaut à une table existante dans SQL Server 2000 / SQL Server 2005 ?
Comment puis-je ajouter une colonne avec une valeur par défaut à une table existante dans SQL Server 2000 / SQL Server 2005 ?
Réponses:
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.
Nom de contrainte facultatif:
si vous CONSTRAINT D_SomeTable_SomeCol
omettez, SQL Server générera automatiquement
une contrainte par défaut avec un nom drôle comme:DF__SomeTa__SomeC__4FB7FEF6
Instruction With-Values facultative:
la WITH VALUES
est nécessaire uniquement lorsque votre colonne est Nullable
et que vous souhaitez que la valeur par défaut soit utilisée pour les enregistrements existants.
Si votre colonne l'est NOT NULL
, elle utilisera automatiquement la valeur par défaut
pour tous les enregistrements existants, que vous le spécifiiez WITH VALUES
ou non.
Fonctionnement des insertions avec une contrainte par défaut:
Si vous insérez un enregistrement dans SomeTable
et ne spécifiez pasSomeCol
la valeur de, il sera défini par défaut sur 0
.
Si vous insérez un enregistrement et spécifiez SomeCol
la valeur de NULL
(et que votre colonne autorise les valeurs nulles),
la contrainte par défaut ne sera pas utilisée et NULL
sera insérée en tant que valeur.
Les notes étaient basées sur les excellents commentaires de chacun ci-dessous.
Un merci spécial à:
@Yatrix, @WalterStabosz, @YahooSerious et @StackMan pour leurs commentaires.
NOT NULL
. Veuillez essayer ceci: 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;
vous verrez 2 valeurs NULL pour la colonne b
.
WITH VALUES
pour mettre à jour les lignes annulables existantes. Voir MSDN : "Si la colonne ajoutée autorise les valeurs nulles et WITH VALUES
est spécifiée, la valeur par défaut est stockée dans la nouvelle colonne, ajoutée aux lignes existantes."
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
L'inclusion de DEFAULT remplit la colonne dans les lignes existantes avec la valeur par défaut, de sorte que la contrainte NOT NULL n'est pas violée.
Lorsque vous ajoutez une colonne nullable , vous vous WITH VALUES
assurerez que la valeur DEFAULT spécifique est appliquée aux lignes existantes:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
contrainte aura toujours une valeur - c'est-à-dire qu'elle ne sera pas NULL, même si elle NOT NULL
n'est pas spécifiée.
BIT
type de données, je parlais de cette BIT
colonne particulière . Regardez la réponse, la colonne est déclarée comme 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
Attention lorsque la colonne que vous ajoutez a une NOT NULL
contrainte, mais n'a pas de DEFAULT
contrainte (valeur). L' ALTER TABLE
instruction échouera dans ce cas si la table contient des lignes. La solution consiste soit à supprimer la NOT NULL
contrainte de la nouvelle colonne, soit à lui fournir une DEFAULT
contrainte.
Si vous souhaitez ajouter plusieurs colonnes, vous pouvez le faire de cette façon, par exemple:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
Utilisation:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Référence: ALTER TABLE (Transact-SQL) (MSDN)
Pour ajouter une colonne à une table de base de données existante avec une valeur par défaut, nous pouvons utiliser:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Voici une autre façon d'ajouter une colonne à une table de base de données existante avec une valeur par défaut.
Un script SQL beaucoup plus approfondi pour ajouter une colonne avec une valeur par défaut est ci-dessous, y compris vérifier si la colonne existe avant de l'ajouter également archiver la contrainte et la supprimer s'il y en a une. Ce script nomme également la contrainte afin que nous puissions avoir une belle convention de dénomination (j'aime DF_) et sinon SQL nous donnera une contrainte avec un nom qui a un nombre généré aléatoirement; donc c'est bien de pouvoir aussi nommer la contrainte.
-------------------------------------------------------------------------
-- 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
Il existe deux façons d'ajouter une colonne à une table de base de données existante avec une valeur par défaut.
Vous pouvez faire la chose avec T-SQL de la manière suivante.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Vous pouvez également utiliser SQL Server Management Studio en cliquant avec le bouton droit sur la table dans le menu Conception, en définissant la valeur par défaut sur table.
Et de plus, si vous souhaitez ajouter la même colonne (si elle n'existe pas) à toutes les tables de la base de données, utilisez alors:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
Dans SQL Server 2008-R2, je passe en mode conception - dans une base de données de test - et j'ajoute mes deux colonnes à l'aide du concepteur et je fais les réglages avec l'interface graphique, puis l'infâme Right-Clickdonne l'option " Générer le script de changement "!
Bang up apparaît une petite fenêtre avec, vous l'aurez deviné, le script de changement garanti au travail correctement formaté. Appuyez sur le bouton facile.
Alternativement, vous pouvez ajouter une valeur par défaut sans avoir à nommer explicitement la contrainte:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
Si vous rencontrez un problème avec les contraintes par défaut existantes lors de la création de cette contrainte, elles peuvent être supprimées par:
alter table [schema].[tablename] drop constraint [constraintname]
Cela peut également être fait dans l'interface graphique SSMS. Je montre une date par défaut ci-dessous mais la valeur par défaut peut être n'importe quoi, bien sûr.
(getdate())
ou abc
ou 0
ou la valeur souhaitée dans le champ Valeur par défaut ou Liaison , comme illustré ci-dessous:ALTER TABLE ADD ColumnName {Column_Type} Constraint
L'article MSDN ALTER TABLE (Transact-SQL) a toute la syntaxe alter table.
Exemple:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
Créez d'abord une table avec le nom étudiant:
CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)
Ajoutez-y une colonne:
ALTER TABLE STUDENT
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)
SELECT *
FROM STUDENT
La table est créée et une colonne est ajoutée à une table existante avec une valeur par défaut.
Cela a beaucoup de réponses, mais je ressens le besoin d'ajouter cette méthode étendue. Cela semble beaucoup plus long, mais il est extrêmement utile si vous ajoutez un champ NOT NULL à une table avec des millions de lignes dans une base de données active.
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
Ce que cela fera, c'est ajouter la colonne en tant que champ nullable et avec la valeur par défaut, mettre à jour tous les champs à la valeur par défaut (ou vous pouvez attribuer des valeurs plus significatives), et enfin cela changera la colonne pour qu'elle ne soit PAS NULL.
La raison en est que si vous mettez à jour une table à grande échelle et ajoutez un nouveau champ non nul, il doit écrire sur chaque ligne et verrouillera par conséquent la table entière lors de l'ajout de la colonne, puis de l'écriture de toutes les valeurs.
Cette méthode ajoutera la colonne nullable qui fonctionne beaucoup plus rapidement par elle-même, puis remplit les données avant de définir le statut non nul.
J'ai trouvé que faire tout cela dans une seule instruction verrouillerait l'une de nos tables les plus actives pendant 4 à 8 minutes et j'ai souvent tué le processus. Cette méthode, chaque partie ne prend généralement que quelques secondes et provoque un verrouillage minimal.
De plus, si vous avez une table dans la zone de milliards de lignes, il peut être utile de regrouper la mise à jour comme suit:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
Essaye ça
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL Server + Modifier la table + Ajouter une colonne + Valeur par défaut uniqueidentifier
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
chèque avant d'essayer de modifier la table. Très bonne solution. Quelques commentaires supplémentaires sur la façon dont cela fonctionne le rendraient encore plus utile.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
Ajoutez une nouvelle colonne à une table:
ALTER TABLE [table]
ADD Column1 Datatype
Par exemple,
ALTER TABLE [test]
ADD ID Int
Si l'utilisateur souhaite l'incrémenter automatiquement, alors:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
C'est pour SQL Server:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
Exemple:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
Si vous souhaitez ajouter des contraintes, alors:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Cela peut être fait par le code ci-dessous.
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
Essayez avec la requête ci-dessous:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Cela ajoutera une nouvelle colonne dans le tableau.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
À partir de cette requête, vous pouvez ajouter une colonne d'entier de type de données avec la valeur par défaut 0.
Eh bien, j'ai maintenant quelques modifications à ma réponse précédente. J'ai remarqué qu'aucune des réponses mentionnées IF NOT EXISTS
. Je vais donc en apporter une nouvelle solution car j'ai rencontré des problèmes pour modifier la table.
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
Voici TaskSheet
le nom de la table particulière et IsBilledToClient
est la nouvelle colonne que vous allez insérer et 1
la valeur par défaut. Cela signifie dans la nouvelle colonne quelle sera la valeur des lignes existantes, donc une sera automatiquement définie à cet endroit. Cependant, vous pouvez changer comme vous le souhaitez en respectant le type de colonne comme je l'ai utilisé BIT
, j'ai donc mis la valeur par défaut 1.
Je suggère le système ci-dessus, car j'ai rencontré un problème. Alors quel est le problème? Le problème est que si la IsBilledToClient
colonne existe dans le tableau, alors si vous exécutez uniquement la partie du code donnée ci-dessous, vous verrez une erreur dans le générateur de requête SQL Server. Mais s'il n'existe pas, pour la première fois il n'y aura pas d'erreur lors de l'exécution.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]