Jak usunąć kolumnę z istniejącej tabeli?
Mam stolik MEN
z Fname
iLname
Muszę usunąć Lname
Jak to zrobić?
Jak usunąć kolumnę z istniejącej tabeli?
Mam stolik MEN
z Fname
iLname
Muszę usunąć Lname
Jak to zrobić?
Odpowiedzi:
ALTER TABLE MEN DROP COLUMN Lname
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
Oto poprawna odpowiedź:
ALTER TABLE MEN DROP COLUMN Lname
Ale ... jeśli CONSTRAINT
istnieje na COLUMN
, to musi pierwszy, wtedy będzie mógł . Aby upuścić a , uruchom:DROP
CONSTRAINT
DROP
COLUMN
CONSTRAINT
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
na kolumnie ?
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 drops
uruchomić w kolumnie tylko wtedy, gdy jestexists
w tabeli inaczej nie wyrzuci błędu.
Zamiast używać dużych IF
opakowań do sprawdzania istnienia column
przed upuszczeniem, możesz po prostu uruchomić powyższą DDL
instrukcję
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
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ć:
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.
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ąć.
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ę.
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 ()
Składnia:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Na przykład:
alter table Employee drop column address;