web-dev-qa-db-fra.com

Comment peut-on supprimer une valeur par défaut d'une colonne dans une table?

Comment modifiez-vous une colonne pour supprimer la valeur par défaut?

La colonne a été créée avec:

 ALTER table sometable Add somecolumn nchar(1) NOT NULL DEFAULT 'N'

Et ensuite modifié avec:

 alter table sometable alter column somecolumn nchar(1) null

Cela autorise les valeurs NULL, mais la valeur par défaut reste. Comment pouvez-vous l'enlever?

38
Yishai

C'est une contrainte par défaut, vous devez effectuer:

ALTER TABLE {TableName} 
DROP CONSTRAINT ConstraintName

Si vous n'avez pas spécifié de nom lors de la création de la contrainte, SQL Server en a créé un pour vous. Vous pouvez utiliser SQL Server Management Studio pour rechercher le nom de la contrainte en accédant à la table, en ouvrant son nœud d'arborescence, puis en ouvrant le nœud Contraintes.

Si je me souviens bien, la contrainte s'appellera quelque chose du type DF_SomeStuff_ColumnName.

EDIT: Josh W. answer contient un lien vers une question SO qui vous explique comment trouver le nom de contrainte généré automatiquement à l'aide de SQL au lieu de l'interface de Management Studio.

39
Dan Rigby

C’est ce que j’ai trouvé (avant de voir Josh W. répondre, eh bien je l’ai vu mais je l’ai écrasé si vite que j’ai mal compris):

declare @name nvarchar(100)
select @name = [name] from sys.objects where type = 'D' and parent_object_id = object_id('sometable')

if (@name is not null)
  begin
     exec ('alter table [sometable] drop constraint [' + @name +']')
  end

L'avantage que j'ai ici est que je sais qu'il n'y a qu'une seule contrainte de ce type sur toute la table. S'il y en avait eu deux, eh bien je suppose que c'est pourquoi vous êtes censé les nommer;).

(Le problème, c’est qu’il s’agit d’une modification apportée à 10 bases de données client différentes, de sorte qu’il n’ya pas un nom cohérent à mettre dans un script)

12
Yishai

Si vous ne connaissez pas le nom des contraintes 

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

https://stackoverflow.com/a/13715343/2547164

7
Mise
select name from sys.default_constraints where name like '%first_3_chars_of_field_name%'

Trouvez votre contrainte et utilisez DROP CONSTRAINT pour la supprimer. Ou exécutez une boucle curseur/while pour supprimer toutes les valeurs par défaut similaires dans la base de données.

4
Roman

Si vous utilisez SQL Server Management Studio, cela est assez facile.

Si plusieurs contraintes sont associées à la table et que vous ne souhaitez pas toutes les supprimer, cliquez avec le bouton droit de la souris sur la contrainte et sélectionnez "Script Cnstraint en tant que -> CRÉER vers -> Nouvelle fenêtre de l'éditeur de requête". Cela vous montrera le code qui a créé la contrainte, y compris le nom de la colonne et la valeur par défaut. 

Ensuite, faites un clic droit sur la contrainte que vous souhaitez supprimer et sélectionnez Supprimer. 

0
Mike Godin