你怎么滴在T-SQL缺省值或类似的约束?(How do you drop a default val

2019-06-25 19:53发布

我知道的语法:

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

但如何我把默认的约束时,我不知道它的名字? (也就是说,它是在自动生成的CREATE TABLE时间。)

Answer 1:

如果你想手动执行此操作,您可以使用Management Studio中找到它(在表内的约束节点下)。

要使用SQL做到这一点:

  • 如果约束默认约束,你可以使用sys.default_constraints找到它:

     SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName FROM sys.default_constraints ORDER BY TableName, ConstraintName 
  • 如果您正在寻找其他的限制以及(检查,独特的,外键,默认情况下,主键),您可以使用sysconstraints

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

你不说你正在使用的SQL Server版本。 SQL 2005和SQL 2008无论在上述工作。



Answer 2:

您可以使用此代码来自动做到这一点:

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)

只需更换<MYTABLENAME><MYCOLUMNNAME>为适当。



Answer 3:

或者你也可以使用sys.check_constraints目录视图中找到它。



Answer 4:

您可以通过sp_help将[表名]找到约束的名字出来,然后通过名称删除它。

或者你也可以很可能是通过管理工作室做到这一点。



Answer 5:

用于在一个单一的线路上使用单个的表和列下列

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;

如果您对列多个约束,你需要在你以后的约束歧视,但如果你只是有一个默认的约束,这将这样的伎俩。

看看在INFORMATION_SCHEMA提供的其他栏目,让您进一步区分。



Answer 6:

这里不用我自己的版本,删除所有相关的约束- 默认约束 (如果存在)和所有受影响的检查约束 (如SQL标准似乎暗示和一些其他数据库似乎如此)

declare @constraints varchar(4000);
declare @sql varchar(4000);
with table_id_column_position as (
   select object_id table_id, column_id column_position
      from sys.columns where object_id is not null and object_id = object_id('TableName') and name = 'ColumnToBeDropped'
)
select @constraints = coalesce(@constraints, 'constraint ') + '[' + name + '], '
from sysobjects 
where (
  -- is CHECK constraint
  type = 'C' 
  -- dependeds on the column
  and id is not null
  and id in (
      select object_id --, object_name(object_id)
      from sys.sql_dependencies, table_id_column_position 
      where object_id is not null
      and referenced_major_id = table_id_column_position.table_id
      and referenced_minor_id = table_id_column_position.column_position
    )
) OR (
  -- is DEFAULT constraint
  type = 'D'
  and id is not null
  and id in (
    select object_id
    from sys.default_constraints, table_id_column_position
     where object_id is not null
     and parent_object_id = table_id_column_position.table_id
     and parent_column_id = table_id_column_position.column_position
  )
);
set @sql = 'alter table TableName drop ' + coalesce(@constraints, '') + ' column ColumnToBeDropped';
exec @sql

(请注意:两个TableNameColumnToBeDropped在代码出现两次以上)

这是通过构建一个ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped和执行它。



文章来源: How do you drop a default value or similar constraint in T-SQL?