Share via


ALTER TABLE - SQL-Befehl

Ermöglicht es, die Struktur einer Tabelle programmgesteuert zu ändern.

ALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1FieldType 
   [(nFieldWidth [, nPrecision])] [NULL | NOT NULL]
   [CHECK lExpression1 [ERROR cMessageText1]] [DEFAULT eExpression1] 
   [PRIMARY KEY | UNIQUE] [REFERENCES TableName2 [TAG TagName1]]
   [NOCPTRANS] [NOVALIDATE]

- oder -

ALTER TABLE TableName1 ALTER [COLUMN] FieldName2 [NULL | NOT NULL]
[SET DEFAULT eExpression2] [SET CHECK lExpression2 [ERROR cMessageText2]]
[DROP DEFAULT] [DROP CHECK] [NOVALIDATE]

- oder -

ALTER TABLE TableName1 [DROP [COLUMN] FieldName3] 
   [SET CHECK lExpression3[ERRORcMessageText3]] [DROP CHECK] 
   [ADD PRIMARY KEY eExpression3 [FOR lExpression4] TAG TagName2] 
   [DROP PRIMARY KEY] 
   [ADD UNIQUE eExpression4 [[FOR lExpression5] TAG TagName3]]
   [DROP UNIQUE TAG TagName4] [ADD FOREIGN KEY [eExpression5] 
      [FOR lExpression6] TAG TagName4 REFERENCES TableName2 
      [TAG TagName5]]
   [DROP FOREIGN KEY TAG TagName6 [SAVE]]
   [RENAME COLUMN FieldName4 TO FieldName5] [NOVALIDATE]

Parameter

  • TableName1
    Gibt den Namen der Tabelle an, deren Struktur geändert werden soll.

  • ADD [COLUMN] FieldName1
    Gibt den Namen des hinzuzufügenden Feldes an. Eine einzelne Tabelle kann bis zu 255 Felder enthalten. Wenn eines oder mehrere der Felder Nullwerte zulassen, reduziert sich diese Anzahl um 1 auf 254 Felder.

  • ALTER [COLUMN] FieldName1
    Gibt den Namen eines bereits vorhandenen Feldes an, das geändert werden soll.

  • FieldType [(nFieldWidth [, nPrecision])]
    Gibt den Feldtyp, die Feldbreite und die Genauigkeit der Feldwerte (Anzahl der Dezimalstellen) für ein neues oder geändertes Feld an.

    FieldType gibt den Datentyp des Feldes in Form eines einzelnen Buchstabens an. Für einige Felddatentypen ist es erforderlich, dass Sie entweder nFieldWidth oder nPrecision bzw. beide Argumente angeben.

    Die folgende Tabelle enthält eine Liste der Werte für FieldType und gibt an, ob nFieldWidth und nPrecision erforderlich sind:

    FieldType nFieldWidth nPrecision Beschreibung
    C N Zeichenfeld der Breite n
    D Datum
    T DatumZeit
    N N D Numerisches Feld der Breite n mit d Dezimalstellen
    F N D Gleitkommafeld der Breite n mit d Dezimalstellen
    I Integer (Ganzzahl)
    B D Double
    Y Währung
    L Logisch
    M Memo
    G Objektfeld
    P Bildfeld

    nFieldWidth und nPrecision werden für die Feldtypen D, T, I, Y, L, M, G und P ignoriert. nPrecision hat den Standardwert Null (keine Dezimalstellen), wenn nPrecision nicht für die Feldtypen N, F oder B angegeben wird.

  • NULL | NOT NULL
    Ermöglicht Nullwerte im Feld bzw. schließt diese aus. Wenn eines oder mehrere der Felder Nullwerte enthalten können, reduziert sich die maximale Anzahl möglicher Felder in einer Tabelle um 1 von 255 auf 254.

    Wenn Sie NULL und NOT NULL auslassen, bestimmt die aktuelle Einstellung von SET NULL, ob Nullwerte im Feld zulässig sind. Wenn NULL und NOT NULL fehlen und Sie die PRIMARY KEY- oder UNIQUE-Klausel angeben, wird dagegen die aktuelle Einstellung von SET NULL ignoriert, und der Standardwert NOT NULL wird für das Feld verwendet.

  • CHECK lExpression1
    Legt eine Gültigkeitsregel für das Feld fest. lExpression1 muss ein logischer Ausdruck und kann eine benutzerdefinierte Funktion oder eine gespeicherte Prozedur sein. Beachten Sie bitte, dass beim Anfügen eines leeren Datensatzes geprüft wird, ob die Gültigkeitsregel erfüllt ist. Wenn die Gültigkeitsregel in den Feldern eines angefügten Datensatzes keine Leerwerte zulässt, wird ein Fehler generiert.

  • ERROR cMessageText1
    Gibt die Fehlermeldung an, die angezeigt wird, wenn die Gültigkeitsregel des Feldes einen Fehler generiert. Diese Meldung wird nur angezeigt, wenn innerhalb eines Datenblatt- oder Bearbeitungsfensters Änderungen an Daten vorgenommen werden.

  • DEFAULT eExpression1
    Gibt einen Standardwert für das Feld an. Der Datentyp von eExpression1 muss mit dem Datentyp des Feldes identisch sein.

  • PRIMARY KEY
    Erstellt einen primären Indexnamen. Der Indexname hat denselben Namen wie das Feld.

  • UNIQUE
    Erstellt auf Basis des Feldes einen potenziellen Indexnamen, der denselben Namen hat wie das Feld.

    Weitere Informationen zu potenziellen Indizes finden Sie unter Funktionsweise von Tabellen.

    Anmerkung   Potenzielle Indizes (die erstellt werden, wenn die UNIQUE-Klausel angegeben ist, die aus Gründen der ANSI-Kompatibilität Bestandteil des ALTER TABLE-Befehls und des CREATE TABLE-Befehls ist) sind nicht dasselbe wie Indizes, die mit einem INDEX-Befehl erstellt werden, wenn in diesem die Klausel UNIQUE angegeben ist. Bei einem Index, der mit der UNIQUE-Option des INDEX-Befehls erstellt wurde, sind doppelt vorhandene Indexschlüssel zulässig, bei potenziellen Indizes sind doppelt vorhandene Indexschlüssel unzulässig.

    Nullwerte und doppelt vorhandene Datensätze sind in einem Feld, das als Primärindex oder als potenzieller Index verwendet wird, nicht zulässig.

    Wenn Sie mit der ADD COLUMN-Klausel ein neues Feld erstellen, generiert Microsoft Visual FoxPro keinen Fehler, wenn Sie einen Primär- oder potenziellen Index für ein Feld erstellen, das Nullwerte unterstützt. Visual FoxPro generiert jedoch einen Fehler, wenn Sie versuchen, einen Null- oder Duplikatwert in ein Feld einzugeben, das als Primär- oder potenzieller Index verwendet wird.

    Für den Fall, dass Sie ein bereits vorhandenes Feld ändern und der Ausdruck des Primär- oder potenziellen Indexes aus Feldern der Tabelle besteht, prüft Visual FoxPro die Felder daraufhin, ob sie Nullwerte oder Duplikatwerte enthalten. Ist dies der Fall, generiert Visual FoxPro einen Fehler, und an der Tabelle werden keine Änderungen vorgenommen.

  • REFERENCES TableName2 TAG TagName1
    Gibt die Master-Tabelle an, zu der eine persistente Beziehung hergestellt wird. TAG TagName1 gibt den Namen des Indexnamens der Master-Tabelle an, auf dem die Beziehung basiert. Die Indexnamen können bis zu 10 Zeichen umfassen.

  • NOCPTRANS
    Unterbindet die Umsetzung von Zeichen- und Memofeldern in eine andere Codepage. Wird die Tabelle in eine andere Codepage konvertiert, bleiben die Felder, für die Sie NOCPTRANS angegeben haben, von der Umsetzung ausgenommen. NOCPTRANS kann nur für Zeichen- und Memofelder angegeben werden.

    Im folgenden Beispiel wird eine Tabelle mit dem Namen TABELLE1 erstellt, die zwei Zeichen- und zwei Memofelder enthält. Sowohl für das zweite Zeichenfeld (char2) als auch für das zweite Memofeld (memo2) ist NOCPTRANS angegeben, damit diese Felder nicht umgewandelt werden.

    CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
       memo1 M, memo2 M NOCPTRANS)
    
  • ALTER [COLUMN] FieldName2
    Gibt den Namen eines bereits vorhandenen Feldes an, das geändert werden soll. Bitte beachten Sie, dass zum Ändern mehrerer Eigenschaften eines Feldes in einem einzelnen ALTER TABLE-Befehl auch mehrmals die ALTER COLUMN-Klausel verwendet werden muss. Weitere Informationen zur Struktur der ALTER COLUMN-Klauseln finden Sie in den Beispielen zum ALTER TABLE-Befehl.

  • SET DEFAULT eExpression2
    Gibt einen neuen Standardwert für ein vorhandenes Feld an. Der Datentyp von eExpression2 muss mit dem Datentyp des Feldes identisch sein.

  • SET CHECK lExpression2
    Legt eine neue Gültigkeitsregel für ein bereits vorhandenes Feld fest. lExpression2 muss ein logischer Ausdruck und kann eine benutzerdefinierte Funktion oder eine gespeicherte Prozedur sein.

  • ERROR cMessageText2
    Gibt die Fehlermeldung an, die angezeigt wird, wenn die Gültigkeitsregel des Feldes einen Fehler generiert. Diese Meldung wird nur angezeigt, wenn innerhalb eines Datenblatt- oder Bearbeitungsfensters Änderungen an Daten vorgenommen werden.

  • DROP DEFAULT
    Löscht den Standardwert des bereits vorhandenen Feldes.

  • DROP CHECK
    Löscht die Gültigkeitsregel für das bereits vorhandene Feld.

  • DROP [COLUMN] FieldName3
    Legt das Feld fest, das aus der Tabelle gelöscht werden soll. Neben dem Feld selbst werden auch dessen Standardwert sowie die Gültigkeitsregel aus der Tabelle gelöscht.

    Für den Fall, dass Index- oder Triggerausdrücke auf das Feld verweisen, werden diese Ausdrücke ungültig, sobald das Feld gelöscht wird. Zwar wird beim Löschen des Feldes kein Fehler generiert, in diesem Fall werden jedoch durch die dann ungültigen Index- oder Triggerausdrücke während der Laufzeit Fehler generiert.

  • SET CHECK lExpression3
    Gibt die Gültigkeitsregel der Tabelle an. lExpression3 muss ein logischer Ausdruck und kann eine benutzerdefinierte Funktion oder eine gespeicherte Prozedur sein.

  • ERROR cMessageText3
    Gibt die Fehlermeldung an, die angezeigt wird, wenn die Gültigkeitsregel des Feldes einen Fehler generiert. Diese Meldung wird nur angezeigt, wenn innerhalb eines Datenblatt- oder Bearbeitungsfensters Änderungen an Daten vorgenommen werden.

  • DROP CHECK
    Löscht die Gültigkeitsregel für die Tabelle.

  • ADD PRIMARY KEY eExpression3 [FOR lExpression4] TAG TagName2
    Fügt der Tabelle einen primären Index hinzu. eExpression3 gibt den Indexausdruck des Primärindexes an; TagName2 gibt den Namen des primären Indexnamens an. Die Indexnamen können bis zu 10 Zeichen umfassen. Ist TAG TagName2 nicht angegeben und eExpression3 mit dem Namen eines Feldes identisch, hat der primäre Indexname denselben Namen wie das in eExpression3 angegebene Feld.

    Fügen Sie FOR lExpression4 hinzu, um eine Bedingung anzugeben, mittels der nur Datensätze, die dem Filterausdruck lExpression4 genügen, für Anzeige und Zugriff zur Verfügung stehen; in der Indexdatei werden nur für die Datensätze, die dem Filterausdruck entsprechen, Primärschlüssel erstellt. Beachten Sie, dass Sie beim Erstellen eines Primärindexes die Verwendung der FOR-Klausel vermeiden sollten; die Eindeutigkeit des Primärschlüssels würde in diesem Fall nur für die Datensätze erzwungen, die der mit FOR lExpression4 angegebenen Bedingung entsprechen. Verwenden Sie zum Erstellen eines gefilterten Indexes stattdessen den INDEX-Befehl mit einer FOR-Klausel.

    Rushmore optimiert einen ALTER TABLE ... FOR lExpression4-Befehl, wenn lExpression4 ein optimierbarer Ausdruck ist. Die beste Leistung erzielen Sie, indem Sie in der FOR-Klausel einen optimierbaren Ausdruck verwenden.

    Weitere Informationen finden Sie unter SET OPTIMIZE und Verwenden von Rushmore zum Beschleunigen des Datenzugriffs.

  • DROP PRIMARY KEY
    Entfernt den Primärindex und dessen Indexnamen. Da eine Tabelle immer nur einen Primärschlüssel haben kann, muss der Name des Primärindexes nicht angegeben werden. Wird ein Primärindex gelöscht, werden auch alle persistenten Beziehungen gelöscht, die auf diesem Primärindex basieren.

  • ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]
    Fügt der Tabelle einen potenziellen Index hinzu. eExpression4 gibt den Indexausdruck des potenziellen Indexes an. TagName3 gibt den Namen des potenziellen Indexnamens an. Die Indexnamen können bis zu 10 Zeichen umfassen. Wenn Sie TAG TagName3 nicht angeben und eExpression4 nur aus dem Namen eines Feldes besteht, hat der potenzielle Indexname denselben Namen wie das in eExpression4 angegebene Feld.

    Fügen Sie FOR lExpression5 hinzu, um eine Bedingung anzugeben, mittels der nur Datensätze, die dem Filterausdruck lExpression5 genügen, für Anzeige und Zugriff zur Verfügung stehen; potenzielle Indexschlüssel werden in der Indexdatei nur für solche Datensätze erstellt, die dem Filterausdruck genügen.

    Rushmore optimiert einen ALTER TABLE ... FOR lExpression5-Befehl, wenn lExpression5 ein optimierbarer Ausdruck ist. Die beste Leistung erzielen Sie, indem Sie in der FOR-Klausel einen optimierbaren Ausdruck verwenden.

    Weitere Informationen finden Sie unter SET OPTIMIZE und Verwenden von Rushmore zum Beschleunigen des Datenzugriffs.

  • DROP UNIQUE TAG TagName4
    Löscht den potenziellen Index und dessen Indexnamen. Da eine Tabelle mehrere potenzielle Indizes haben kann, müssen Sie den Namen des potenziellen Indexnamens angeben.

  • ADD FOREIGN KEY [eExpression5] TAG TagName4 [FOR lExpression6]
    Fügt der Tabelle einen Fremdindex (keinen Primärindex) hinzu. eExpression5 gibt den Indexausdruck des Fremdindexes an; TagName4 gibt den Namen des fremden Indexnamens an. Die Indexnamen können bis zu 10 Zeichen umfassen.

    Fügen Sie FOR lExpression6 hinzu, um eine Bedingung anzugeben, mittels der nur Datensätze, die dem Filterausdruck lExpression6 genügen, für Anzeige und Zugriff zur Verfügung stehen; Fremdschlüssel werden in der Indexdatei nur für solche Datensätze erstellt, die dem Filterausdruck genügen.

    Rushmore optimiert einen ALTER TABLE ... FOR lExpression6-Befehl, wenn lExpression6 ein optimierbarer Ausdruck ist. Die beste Leistung erzielen Sie, indem Sie in der FOR-Klausel einen optimierbaren Ausdruck verwenden.

    Weitere Informationen finden Sie unter SET OPTIMIZE und Verwenden von Rushmore zum Beschleunigen des Datenzugriffs.

  • REFERENCES TableName2 [TAG TagName5]
    Gibt die Master-Tabelle an, zu der eine persistente Beziehung hergestellt wird. Geben Sie TAG TagName5 an, um eine Beziehung herzustellen, die auf einem vorhandenen Indexnamen der übergeordneten Tabelle basiert. Die Indexnamen können bis zu 10 Zeichen umfassen. Wenn Sie TAG TagName5 nicht angeben, wird die Beziehung durch den primären Indexnamen der Master-Tabelle hergestellt.

  • DROP FOREIGN KEY TAG TagName6 [SAVE]
    Löscht einen Fremdschlüssel, dessen Indexname TagName6 lautet. Wenn Sie SAVE nicht angeben, wird der Indexname aus der strukturierten Indexdatei gelöscht. Wenn Sie dies verhindern möchten, geben Sie SAVE an.

  • RENAME COLUMN FieldName4 TO FieldName5
    Ermöglicht das Ändern des Namens eines Feldes in der Tabelle. FieldName4 gibt den Namen des umzubenennenden Feldes an. FieldName5 gibt den neuen Namen des Feldes an.

    Vorsicht   Es ist möglich, dass in Indexausdrücken, feld- und tabellenbezogenen Gültigkeitsregeln, Befehlen, Funktionen usw. auf die ursprünglichen Feldnamen verwiesen wird, daher sollten Sie beim Umbenennen äußerst vorsichtig vorgehen.

  • NOVALIDATE
    Gibt an, dass Visual FoxPro bezüglich der Struktur der Tabelle Änderungen gestattet, die eventuell die Integrität der in der Tabelle abgelegten Daten verletzen. Standardmäßig verhindert Visual FoxPro, dass mit einem ALTER TABLE-Befehl die Struktur einer Tabelle so geändert wird, dass die Integrität der in der Tabelle abgelegten Daten verletzt wird. Wenn Sie dieses standardmäßige Verhalten außer Kraft setzen möchten, geben Sie NOVALIDATE an.

Hinweise

Mit Hilfe von ALTER TABLE kann die Struktur einer Tabelle geändert werden, die noch nicht zu einer Datenbank hinzugefügt wurde. Visual FoxPro generiert einen Fehler, wenn Sie die Struktur einer freien Tabelle ändern und dabei eine der DEFAULT-, FOREIGN KEY-, PRIMARY KEY-, REFERENCES- oder SET-Klauseln angeben.

Ein ALTER TABLE-Befehl legt die jeweilige Tabelle eventuell neu an, indem er einen neuen Tabellenvorspann erstellt sowie neue Einträge an den Tabellenvorspann anfügt. Wenn der Typ oder die Breite eines Feldes geändert wurde, kann dies z. B. dazu führen, dass eine neue Tabelle angelegt wird.

Sobald eine Tabelle neu erstellt ist, werden für jedes Feld, dessen Typ oder Breite sich geändert hat, die feldbezogenen Gültigkeitsregeln angewendet. Wenn Sie den Typ oder die Breite eines Feldes in einer Tabelle ändern, wird die tabellenbezogene Gültigkeitsregel angewendet.

Wenn Sie Änderungen an den feldbezogenen Gültigkeitsregeln oder an der tabellenbezogenen Gültigkeitsregel einer Tabelle vornehmen, die bereits Datensätze enthält, gleicht Visual FoxPro die vorhandenen Daten gegen die neuen Regeln ab und gibt eine Warnung aus, sobald es die erste Verletzung einer feld- oder tabellenbezogenen Gültigkeitsregel oder eine Triggerverletzung entdeckt hat.

Der ALTER TABLE-Befehl liefert möglicherweise keine einheitlichen Ergebnisse, wenn er zusammen mit Visual FoxPro-Cursors verwendet wird, die mit dem CREATE CURSOR-Befehl erstellt wurden. Sie können einen Visual FoxPro-Cursor mit Features (z. B. langen Feldnamen) erstellen, die normalerweise nur zusammen mit Tabellen verfügbar sind, die Teil eines Datenbank-Containers sind. Der ALTER TABLE-Befehl speichert eine temporäre Kopie des Cursors, so dass die Regeln, die für freie Tabellen gelten, in Kraft treten. Alle Features, für die die Datenbankunterstützung erforderlich ist, werden auf unvorhersehbare Weise geändert. Aus diesem Grund sollten Sie die Verwendung des ALTER TABLE-Befehls in Zusammenhang mit Visual FoxPro-Cursorn grundsätzlich vermeiden, es sei denn, Sie haben das Ergebnis getestet und verstanden.

Beispiel

In Beispiel 1 wird der Tabelle customer das Feld Fax1 hinzugefügt, und es wird festgelegt, dass in diesem Feld die Eingabe von Nullwerten zulässig ist.

In Beispiel 2 wird das Feld cust_id zum Primärschlüssel der Tabelle customer.

In Beispiel 3 wird dem Feld quantity der Tabelle orditems eine feldbezogene Gültigkeitsregel zugewiesen, die besagt, dass die Werte im Feld quantity nicht negativ sein dürfen.

In Beispiel 4 wird eine persistente 1:n-Beziehung zwischen den Tabellen customer und orders hergestellt, die auf dem Primärschlüssel cust_id der Tabelle customer und einem neuen Fremdschlüssel cust_id der Tabelle orders basiert.

In Beispiel 5 wird die feldbezogene Gültigkeitsregel für das Feld quantity der Tabelle orditems entfernt.

In Beispiel 6 wird die persistente Beziehung zwischen den Tabellen customer und orders entfernt, der Indexname cust_id der Tabelle orders jedoch beibehalten.

In Beispiel 7 wird der Tabelle customer das Feld Fax2 hinzugefügt, und es wird festgelegt, dass in diesem Feld die Eingabe von Nullwerten nicht zulässig ist. Anschließend wird die neue Struktur der Tabelle angezeigt. Damit das Feld Nullwerte enthalten kann und um den Standardwert für das Feld auf den Nullwert zu setzen, werden zwei ALTER COLUMN-Klauseln verwendet. Bitte beachten Sie, dass zum Ändern mehrerer Eigenschaften eines Feldes in einem einzelnen ALTER TABLE-Befehl auch mehrmals die ALTER COLUMN-Klausel verwendet werden muss. Das neue Feld wird anschließend aus der Tabelle gelöscht, um den Originalzustand der Tabelle wiederherzustellen.

* Example 1
SET PATH TO (HOME(2) + 'Data\')     && Sets path to table
ALTER TABLE customer ADD COLUMN fax c(20) NULL

* Example 2
ALTER TABLE customer ADD PRIMARY KEY cust_id TAG cust_id

ALTER TABLE customer ALTER COLUMN cust_id c(5) PRIMARY KEY

* Example 3
ALTER TABLE orders;
    ALTER COLUMN quantity SET CHECK quantity >= 0;
    ERROR "Quantities must be non-negative"

* Example 4
ALTER TABLE orders;
   ADD FOREIGN KEY cust_id TAG cust_id REFERENCES customer

* Example 5
ALTER TABLE orders ALTER COLUMN quantity DROP CHECK

* Example 6
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE

* Example 7
CLEAR
ALTER TABLE customer ADD COLUMN fax2 c(20) NOT NULL
DISPLAY STRUCTURE

ALTER TABLE customer;
   ALTER COLUMN fax2 NULL;
   ALTER COLUMN fax2 SET DEFAULT .NULL.

ALTER TABLE customer DROP COLUMN fax2

Siehe auch

CREATE TABLE - SQL-Befehl | INDEX-Befehl | MODIFY STRUCTURE-Befehl | OPEN DATABASE-Befehl | SET OPTIMIZE-Befehl | Verwenden von Rushmore zum Beschleunigen des Datenzugriffs