2009-05-05 4 views
15

나는 명령 아래 사용하여 하나 개의 테이블 만들었습니다제약 조건의 이름을 모른 채 외래 키를 삭제 하시겠습니까?

create table Table1(
    Id int Not Null 
     Foreign key 
     references Table2(Id) 
     on delete cascade 
     on update cascade, 
    UserName nvarchar(150), 
    TimeInSeconds int Not Null 

    primary key(Id,TimeInSeconds) 
); 

을하지만 지금은 외래 키를 드롭합니다. 내가 제약 조건 이름을 부여 havent 한 것처럼 내가 사용하지 못할 :

Alter table <tablename> 
drop foreign key <foreign key name> 

을 어떤 방법이 있나요? Pls 도움. 당신은 단지 기업 관리자/당신은 키의 목록을 확인하고 거기에서 삭제할 수 있습니다 관리 스튜디오에서 테이블을 보면

답변

20

당신은 INFORMATION_SCHEMA.TABLE_CONSTRAINTS

select CONSTRAINT_NAME 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
where TABLE_NAME = 'Table1' 
+0

+1. 빠른 추첨. 내가 갈 : select * from syscontraints 여기서 xtype = 'F'이고 이름은 '% table1 %' –

+0

같은 스키마를 가져야하는 여러 데이터베이스를 릴리스하기 위해 스크립트에서이 작업을 수행하는 경우를 제외하고는 어떻게됩니까? 데이터베이스의 각 인스턴스마다 제약 조건이 달라질 수 있습니까? 이 경우에는 작동하지 않습니다. – Peter

+0

@Peter, 이상적으로 명명 된 제약 조건을 갖지만, 그렇지 않은 경우 스크립트 런타임에서 이름을 얻을 수 있습니다. 문제가 보이지 않습니다. –

0

에 제약 조건의 이름을 찾을 수 있습니다.

-2

당신은 넣을 수 있습니다 :

> 쇼 테이블 TABLENAME을 만들;

테이블, 열, 유형 등이 어떻게 생성되었는지 확인할 수 있습니다. 제약 조건 이름을 볼 수 있습니다.

+1

'SHOW CREATE TABLE tablename;은 MySQL 관련 명령입니다. 이 질문은 완전히 다른 제품인 Microsoft SQL Sever에 대한 것입니다. – Raystorm

21

Ed 's Answer와 유사하지만 테이블과 열 이름을 기반으로 키 이름을 선택할 수 있습니다.

그런 식으로 스크립트에서 실행하거나 제약 조건을 삭제할 하위 쿼리로 실행할 수 있습니다.

SELECT CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'post' 
AND COLUMN_NAME = 'userID' 
4

몇 가지 문제가 발생하여 답변이 확대되었습니다. 또한, 나는이 외래 키가 선언했다, 그래서 그것은 단지 무시됩니다 null이 있다면 나는 유지하는 옵션 키를 추가 :

declare @name varchar(255), 
    @table varchar(255) = 'mytable', 
    @column varchar(255) = 'mykeycolumn', 
    @validkey varchar(255) = 'mykeyIwanttokeep' 

SELECT @name = CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = @table 
    AND COLUMN_NAME = @column 
    AND (CONSTRAINT_NAME != @validkey or @validkey is null) 

declare @sql varchar(1023) = 'alter table ' + @table + ' drop ' + @name 

exec (@sql) 
+1

AND COLUMN_NAME = ** @ column ** –

+0

고마워, 업데이트 됨 – SumGuy

+0

전체적으로 질문에 대답 해 주셔서 감사합니다. 다른 모든 사람들은 SQL Server가 매개 변수화할 수없는 실제 드롭 부분을 놓쳤습니다. –

1

SQL 서버 옵션 :

DECLARE @foreignkey varchar(100) 
DECLARE @tablename varchar(100) 
DECLARE @command nvarchar(1000) 

DECLARE db_cursor CURSOR FOR 
SELECT fk.name, t.name 
FROM sys.foreign_keys fk 
JOIN sys.tables t ON t.object_id = fk.parent_object_id 
WHERE t.name IN (
    'table_1_name_here', 
    'table_2_name_here' 
) 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @command = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @foreignkey 
    EXECUTE(@command) 
    FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 

는 SQL 선택 관심있는 테이블에 대한 모든 제약 조건을 커서에 넣고 하나씩 삭제하십시오. 당신이 알아야 할 것은 그들이 떨어 뜨리고 싶었던 테이블의 이름뿐입니다.

관련 문제