Jak usunąć kolumnę z istniejącej tabeli?


Odpowiedzi:



157

Rodzajowy:

ALTER TABLE table_name DROP COLUMN column_name;

W Twoim przypadku:

ALTER TABLE MEN DROP COLUMN Lname;

72

Twój przykład jest prosty i nie wymaga żadnych dodatkowych zmian w tabeli, ale ogólnie rzecz biorąc, nie jest to takie trywialne.

Jeśli do tej kolumny odwołują się inne tabele, musisz dowiedzieć się, co zrobić z innymi tabelami / kolumnami. Jedną z opcji jest usunięcie kluczy obcych i zachowanie odnośników w innych tabelach.

Inną opcją jest znalezienie wszystkich odnośników i usunięcie ich, jeśli nie są już potrzebne.

W takich przypadkach prawdziwym wyzwaniem jest znalezienie wszystkich kluczy obcych. Możesz to zrobić, sprawdzając tabele systemowe lub korzystając z narzędzi innych firm, takich jak ApexSQL Search (bezpłatny) lub Red Gate Dependency tracker (premium, ale więcej funkcji). Cały klucz na temat kluczy obcych jest tutaj


47

Oto poprawna odpowiedź:

ALTER TABLE MEN DROP COLUMN Lname

Ale ... jeśli CONSTRAINTistnieje na COLUMN, to musi pierwszy, wtedy będzie mógł . Aby upuścić a , uruchom:DROPCONSTRAINTDROPCOLUMNCONSTRAINT

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE nazwa_tb DROP FOREIGN KEY_nazwa_klucza
bortunac

3
HOW-TO szukaj constraintna kolumnie ?
Kiquenet,

21

W SQL Server 2016 można używać nowych instrukcji DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Powyższe zapytanie można ponownie dropsuruchomić w kolumnie tylko wtedy, gdy jestexists w tabeli inaczej nie wyrzuci błędu.

Zamiast używać dużych IFopakowań do sprawdzania istnienia columnprzed upuszczeniem, możesz po prostu uruchomić powyższą DDLinstrukcję


3
Jakie są oświadczenia DIE ?
Kiquenet,

3
Nawiasem mówiąc, możesz wywoływać tego rodzaju skrypty / funkcje „do ponownego uruchomienia” Idempotent
tomosius

4
to powinna być zaakceptowana odpowiedź. Jeśli masz zautomatyzowane wdrożenia skryptów SQL, musisz napisać swoje skrypty w taki sposób, aby były defensywne.
zwycięzca

7

Pytanie brzmi: czy możesz usunąć tylko kolumnę z nieistniejącej tabeli ;-)

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  

1
Przypuszczam, że jeśli chcesz upuścić kolumnę z nieistniejącej tabeli, byłby to sposób na zrobienie tego
Matiaan,

6

Prostą odpowiedzią na to jest użycie tego:

ALTER TABLE MEN DROP COLUMN Lname;

Można podać więcej niż jedną kolumnę w następujący sposób:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

Z SQL Server 2016 można również upuścić kolumnę tylko wtedy, gdy istnieje. Zapobiega to pojawianiu się błędu, gdy kolumna nie istnieje, co prawdopodobnie nie ma znaczenia.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Istnieje kilka warunków wstępnych upuszczania kolumn. Upuszczone kolumny nie mogą być:

  • Używany przez indeks
  • Używany przez ograniczenia CHECK, FOREIGN KEY, UNIQUE lub PRIMARY KEY
  • Związany z DOMYŚLNYM
  • Związany z regułą

Jeśli którakolwiek z powyższych sytuacji jest prawdziwa, najpierw musisz porzucić te skojarzenia.

Należy również zauważyć, że upuszczenie kolumny nie powoduje odzyskania miejsca z dysku twardego, dopóki indeks klastrowy tabeli nie zostanie odbudowany. W związku z tym często dobrym pomysłem jest przestrzeganie powyższego polecenia za pomocą polecenia odbudowania tabeli:

ALTER TABLE MEN REBUILD;

Wreszcie, jak niektórzy powiedzieli, może to być powolne i prawdopodobnie zablokuje tabelę na czas trwania. Możliwe jest utworzenie nowej tabeli o pożądanej strukturze, a następnie zmiana nazwy w następujący sposób:

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;

Ale ostrzegamy, że istnieje okno utraty danych wstawionych wierszy między pierwszym poleceniem select a ostatnią zmianą nazwy.


2

Aby dodać kolumny do istniejącej tabeli:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Aby usunąć kolumny z istniejącej tabeli:

ALTER TABLE table_name
DROP COLUMN column_name

Pytanie nie dotyczy kolumn ADD .
Kiquenet,

2

Można to również zrobić za pomocą graficznego interfejsu użytkownika SSMS. Zaletą tej metody jest to, że ostrzega, jeśli istnieją jakieś relacje w tej kolumnie, a także może automatycznie je usunąć.

  1. Umieść tabelę w widoku Projekt (kliknij prawym przyciskiem myszy tabelę) w następujący sposób:

wprowadź opis zdjęcia tutaj

  1. Kliknij prawym przyciskiem myszy kolumnę w widoku projektu tabeli i kliknij „Usuń kolumnę”

wprowadź opis zdjęcia tutaj

Jak powiedziałem wcześniej, jeśli istnieją jakieś relacje, które również powinny zostać usunięte, w tym momencie zapyta Cię, czy chcesz je również usunąć. Prawdopodobnie będziesz musiał to zrobić, aby usunąć kolumnę.


0

Jeśli używasz C #, a kolumna Tożsamość to int, utwórz nową instancję int bez podawania żadnej wartości. To zadziałało dla mnie.

[tożsamość_kolumna] = new int ()


Co zrobi ta odpowiedź? Czy usunie kolumnę z tabeli?
Prashant Pimpale,

0

Składnia:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Na przykład:

alter table Employee drop column address;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.