66 votes

Comment supprimer une valeur par défaut ou une contrainte similaire dans T-SQL?

Je connais la syntaxe:

 ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]
 

mais comment supprimer la contrainte par défaut quand je ne connais pas son nom? (Autrement dit, il a été généré automatiquement à CREATE TABLE temps.)

62voto

Polemarch Points 676

Vous pouvez utiliser ce code pour le faire automatiquement:

 DECLARE @tableName VARCHAR(MAX) = '<MYTABLENAME>'
DECLARE @columnName VARCHAR(MAX) = '<MYCOLUMNAME>'
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 = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
    EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)
 

Il suffit de remplacer <MYTABLENAME> et <MYCOLUMNNAME> selon le cas.

47voto

adrianbanks Points 36858

Si vous voulez le faire manuellement, vous pouvez utiliser la Gestion de Studio pour le trouver (sous les Contraintes nœud à l'intérieur de la table).

Faire à l'aide de SQL:

  • Si les contraintes sont contraintes par défaut, vous pouvez utiliser sys.default_constraints trouver:

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName
    FROM sys.default_constraints ORDER BY TableName, ConstraintName
    
  • Si vous cherchez d'autres contraintes (chèque, unique, clé étrangère, par défaut, la clé primaire), vous pouvez utiliser sysconstraints:

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName
    FROM sysconstraints ORDER BY TableName, ConstraintName
    

Vous ne dites pas quelle version de SQL Server que vous utilisez. Le travail ci-dessus sur SQL 2005 et SQL 2008.

4voto

Alex_L Points 2297

Ou vous pouvez le trouver en utilisant la vue catalogue sys.check_constraints.

3voto

Tetraneutron Points 8494

Vous pouvez rechercher le nom de la contrainte par sp_help [nom de la table], puis le supprimer par son nom.

Ou vous pouvez probablement le faire via le studio de gestion.

1voto

sweetfa Points 1378

Pour une seule table et une seule colonne sur une seule ligne, utilisez ce qui suit:

 declare @sql nvarchar(max); set @sql = ''; SELECT @sql+='ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT ' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = 'YOURTABLENAME'AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = 'YOURTABLENAME' and COLUMN_NAME = 'YOURCOLUMNNAM'))) + ';'; EXEC sp_executesql @sql;
 

Si vous avez plusieurs contraintes sur la colonne, vous devrez faire la distinction entre la contrainte que vous recherchez, mais si vous avez juste une contrainte par défaut, cela fera l'affaire.

Consultez les autres colonnes disponibles dans information_schema pour vous permettre de mieux distinguer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X