T-SQL에서 기본값 또는 유사한 제약 조건을 어떻게 삭제합니까?
구문을 알고 있습니다.
ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]
하지만 이름을 모르는 경우 기본 제약 조건을 삭제하는 방법은 무엇입니까? (즉, CREATE TABLE
시간 에 자동 생성되었습니다 .)
이 작업을 수동으로 수행하려는 경우 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 모두에서 작동합니다.
이 코드를 사용하여 자동으로 수행 할 수 있습니다.
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>
적절한.
또는 sys.check_constraints 카탈로그 뷰를 사용하여 찾을 수 있습니다.
sp_help [테이블 이름]에서 제약 조건의 이름을 찾은 다음 이름으로 삭제할 수 있습니다.
또는 Management Studio를 통해이 작업을 수행 할 수 있습니다.
한 줄의 단일 테이블 및 열에 대해 다음을 사용하십시오.
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에서 사용 가능한 다른 열을 확인하십시오.
여기에 모든 종속 제약 조건을 삭제하는 내 버전이 있습니다. 기본 제약 조건 (존재하는 경우) 및 영향을받는 모든 검사 제약 조건 (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
(주의 : 위의 코드에서 TableName
와 ColumnToBeDropped
두 번 모두 표시됨)
This works by constructing single ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped
and executing it.
'Programing' 카테고리의 다른 글
[UIImage imageNamed…]와 [UIImage imageWithData…]의 차이점은 무엇입니까? (0) | 2020.11.18 |
---|---|
SQL Server에 IP 주소를 저장하는 데 가장 적합한 데이터 유형은 무엇입니까? (0) | 2020.11.18 |
TFS 변경 집합을 찾는 방법은 무엇입니까? (0) | 2020.11.18 |
Java로 간단한 HTTP 서버를 만드시겠습니까? (0) | 2020.11.18 |
Java 검색에서 클래스 파일 이름은 .class 예외로 끝나야합니다. (0) | 2020.11.17 |