기존 테이블에서 열을 제거하는 방법?
나는 테이블 MEN
이 Fname
있고Lname
나는 제거해야합니다 Lname
어떻게합니까?
기존 테이블에서 열을 제거하는 방법?
나는 테이블 MEN
이 Fname
있고Lname
나는 제거해야합니다 Lname
어떻게합니까?
답변:
ALTER TABLE MEN DROP COLUMN Lname
귀하의 예는 간단하고 추가 테이블 변경이 필요하지 않지만 일반적으로 이것은 간단하지 않습니다.
이 열이 다른 테이블에서 참조되는 경우 다른 테이블 / 열로 수행 할 작업을 파악해야합니다. 한 가지 옵션은 외래 키를 제거하고 참조 된 데이터를 다른 테이블에 유지하는 것입니다.
또 다른 옵션은 모든 참조 열을 찾아 더 이상 필요하지 않은 경우 제거하는 것입니다.
이러한 경우 실제 문제는 모든 외래 키를 찾는 것입니다. 시스템 테이블을 쿼리하거나 ApexSQL 검색 (무료) 또는 Red Gate Dependency 추적기 (프리미엄이지만 더 많은 기능) 와 같은 타사 도구를 사용하여이를 수행 할 수 있습니다 . 외래 키에 전체 스레드가 있습니다.
이것이 정답입니다.
ALTER TABLE MEN DROP COLUMN Lname
A는하지만 ... CONSTRAINT
온 존재 COLUMN
, 당신은해야한다 첫 번째는, 당신은 수있을 것 . 를 삭제하려면 다음을 실행하십시오.DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
하는 방법 ?
에서 SQL 서버 2016 는 새로운 DIE 문을 사용할 수 있습니다.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
위 쿼리는 테이블에있는 drops
경우에만 열을 다시 exists
실행할 수 있습니다. 그렇지 않으면 오류가 발생하지 않습니다.
IF
존재 여부를 확인하기 위해 큰 래퍼를 사용하는 대신column
삭제하기 전에 위의 DDL
명령문을 실행할 수 있습니다 .
문제는 존재하지 않는 테이블에서만 열을 삭제할 수 있습니까? ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
이것에 대한 간단한 대답은 이것을 사용하는 것입니다.
ALTER TABLE MEN DROP COLUMN Lname;
다음과 같이 둘 이상의 열을 지정할 수 있습니다.
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
SQL Server 2016부터는 열이있는 경우에만 열을 삭제할 수 있습니다. 열이 존재하지 않을 때 오류가 발생하지 않아서 신경 쓰지 않아도됩니다.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
열을 삭제하기위한 전제 조건이 있습니다. 삭제 된 열은 다음과 같습니다.
위의 사항 중 하나라도 해당되는 경우 먼저 해당 연결을 삭제해야합니다.
또한 열을 삭제해도 테이블의 클러스터형 인덱스가 다시 작성 될 때까지 하드 디스크에서 공간을 회수하지 않습니다. 따라서 다음과 같이 테이블 재 구축 명령을 사용하여 위의 내용을 따르는 것이 좋습니다.
ALTER TABLE MEN REBUILD;
마지막으로 일부 사람들이 말했듯이 이것은 느릴 수 있으며 아마도 지속 시간 동안 테이블을 잠글 것입니다. 원하는 구조로 새 테이블을 만들고 다음과 같이 이름을 바꿀 수 있습니다.
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
그러나 첫 번째 선택 명령과 마지막 이름 바꾸기 명령 사이에 삽입 된 행의 데이터 손실에 대한 창이 있습니다.
C #을 사용하고 Identity 열이 int이면 값을 제공하지 않고 int의 새 인스턴스를 만듭니다.
[identity_column] = 새로운 int ()