Wie entferne ich eine Spalte aus einer vorhandenen Tabelle?
Ich habe einen Tisch MEN
mit Fname
undLname
Ich muss das entfernen Lname
Wie es geht?
Wie entferne ich eine Spalte aus einer vorhandenen Tabelle?
Ich habe einen Tisch MEN
mit Fname
undLname
Ich muss das entfernen Lname
Wie es geht?
Antworten:
ALTER TABLE MEN DROP COLUMN Lname
Ihr Beispiel ist einfach und erfordert keine zusätzlichen Tabellenänderungen, aber im Allgemeinen ist dies nicht so trivial.
Wenn diese Spalte von anderen Tabellen referenziert wird, müssen Sie herausfinden, was mit anderen Tabellen / Spalten zu tun ist. Eine Möglichkeit besteht darin, Fremdschlüssel zu entfernen und referenzierte Daten in anderen Tabellen zu behalten.
Eine andere Möglichkeit besteht darin, alle referenzierenden Spalten zu finden und ebenfalls zu entfernen, wenn sie nicht mehr benötigt werden.
In solchen Fällen besteht die eigentliche Herausforderung darin, alle Fremdschlüssel zu finden. Sie können dies tun, indem Sie Systemtabellen abfragen oder Tools von Drittanbietern wie ApexSQL Search (kostenlos) oder Red Gate Dependency Tracker (Premium, aber mehr Funktionen) verwenden. Es gibt einen ganzen Thread auf Fremdschlüssel hier
Dies ist die richtige Antwort:
ALTER TABLE MEN DROP COLUMN Lname
Aber ... wenn ein CONSTRAINT
auf das existiert COLUMN
, dann müssen Sie DROP
das CONSTRAINT
erste, dann sind Sie in der Lage sein , DROP
die COLUMN
. CONSTRAINT
Führen Sie Folgendes aus , um a zu löschen :
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
einer Spalte ?
In SQL Server 2016 können Sie neue DIE-Anweisungen verwenden.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
Die obige Abfrage kann in drops
der Spalte nur dann erneut ausgeführt werden, wenn dies der Fall istexists
in der in der Tabelle andernfalls keinen Fehler auslöst.
Anstatt große IF
Wrapper zu verwenden, um die Existenz von zu überprüfen, column
bevor Sie sie löschen, können Sie einfach die obige DDL
Anweisung ausführen
Die Frage ist, können Sie nur eine Spalte aus einer nicht vorhandenen Tabelle löschen ;-)
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
Die einfache Antwort darauf lautet:
ALTER TABLE MEN DROP COLUMN Lname;
Es kann mehr als eine Spalte wie folgt angegeben werden:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
Ab SQL Server 2016 ist es auch möglich, die Spalte nur dann zu löschen, wenn sie vorhanden ist. Dies verhindert, dass Sie eine Fehlermeldung erhalten, wenn die Spalte nicht vorhanden ist, was Sie wahrscheinlich nicht interessiert.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Es gibt einige Voraussetzungen, um Spalten zu löschen. Die abgelegten Spalten können nicht sein:
Wenn eine der oben genannten Aussagen zutrifft, müssen Sie diese Assoziationen zuerst löschen.
Es sollte auch beachtet werden, dass das Löschen einer Spalte den Speicherplatz von der Festplatte nicht zurückfordert, bis der Clustered-Index der Tabelle neu erstellt wird. Daher ist es oft eine gute Idee, dem obigen Befehl einen Tabellenwiederherstellungsbefehl wie den folgenden zu folgen:
ALTER TABLE MEN REBUILD;
Schließlich kann dies, wie einige gesagt haben, langsam sein und wird wahrscheinlich die Tabelle für die Dauer sperren. Es ist möglich, eine neue Tabelle mit der gewünschten Struktur zu erstellen und diese dann wie folgt umzubenennen:
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;
Beachten Sie jedoch, dass hier zwischen dem ersten Auswahl- und dem letzten Umbenennungsbefehl ein Fenster für den Datenverlust eingefügter Zeilen angezeigt wird.
Dies kann auch über die SSMS-GUI erfolgen. Das Schöne an dieser Methode ist, dass Sie gewarnt werden, wenn in dieser Spalte Beziehungen vorhanden sind, und diese auch automatisch gelöscht werden können.
Wie bereits erwähnt, werden Sie an dieser Stelle gefragt, ob Sie auch diese löschen möchten, wenn es Beziehungen gibt, die ebenfalls gelöscht werden müssten. Sie müssen dies wahrscheinlich tun, um die Spalte zu löschen.
Wenn Sie C # verwenden und die Spalte "Identität" int ist, erstellen Sie eine neue Instanz von int, ohne einen Wert anzugeben. Es hat bei mir funktioniert.
[identity_column] = new int ()
Syntax:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Zum Beispiel:
alter table Employee drop column address;