Syntax alter table - Cikk

Szintaxis ALTER TABLE

ALTER # 91; IGNORE # 93; TABLE tbl_name
alter_specification # 91;. alter_specification # 93;.

alter_specification:
table_option.
| ADD # 91; oszlop # 93; COL_NAME column_definition
# 91; ELSŐ | UTÁN COL_NAME # 93;
| ADD # 91; oszlop # 93; # 40; COL_NAME column_definition. # 41;
| ADD # 123; INDEX | KEY # 125; # 91; index_name # 93;
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; szimbólum # 93; # 93; PRIMARY KEY
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; szimbólum # 93; # 93;
EGYEDI # 91; INDEX | KEY # 93; # 91; index_name # 93;
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; FULLTEXT | TERÜLETI # 93; # 91; INDEX | KEY # 93; # 91; index_name # 93;
# 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; szimbólum # 93; # 93;
FOREIGN KEY # 91; index_name # 93; # 40; index_col_name. # 41;
reference_definition
| ALTER # 91; oszlop # 93; COL_NAME # 123; SET DEFAULT szó | DROP DEFAULT # 125;
| VÁLTOZÁS # 91; oszlop # 93; old_col_name new_col_name column_definition
# 91; ELSŐ | UTÁN COL_NAME # 93;
| MÓDOSÍTANI # 91; oszlop # 93; COL_NAME column_definition
# 91; ELSŐ | UTÁN COL_NAME # 93;
| DROP # 91; oszlop # 93; COL_NAME
| DROP PRIMARY KEY
| DROP # 123; INDEX | KEY # 125; index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE gombok
| ÁTNEVEZÉS # 91; TO # 93; new_tbl_name
| ORDER BY COL_NAME # 91;. COL_NAME # 93;.
| CONVERT karakterkészlet charset_name # 91; LEVÁLOGAT collation_name # 93;
| # 91; DEFAULT # 93; CHARACTER SET # 91; = # 93; charset_name # 91; LEVÁLOGAT # 91; = # 93; collation_name # 93;
| ELVETÉS TABLESPACE
| IMPORT TABLESPACE

index_col_name:
COL_NAME # 91; # 40; hossz # 41; # 93; # 91; ASC | DESC # 93;

index_type:
HASZNÁLATA # 123; B-fán alapuló | hash | RTREE # 125;

ALTER TABLE utasítás szintaxisa sok esetben hasonló a szintaxis CREATE TABLE. További információért lásd. Szakasz 11.1.5 „CREATE TABLE Syntax”.

Ha az ALTER TABLE utasítás egy oszlop változik, leírás, de leírnak tbl_name jelzi, hogy a oszlop változatlan marad, akkor lehetséges, hogy a MySQL kiszolgáló figyelmen kívül hagyta a módosítással az egyik oka részben leírt 11.1.5.1 „Csendes oszlop megváltoztassa”

A legtöbb esetben, ALTER TABLE működik, hogy egy ideiglenes másolatot készít az eredeti tábla. Változások a másolatot, majd az eredeti tábla törlésre kerül, és az újat átnevezni. Míg ALTER TABLE végrehajtó, az eredeti tábla olvasható más ügyfelek. Frissítése és az írás az adatok megmaradnak a táblázatban, amíg az új tábla készen áll, majd automatikusan továbbítja az új tábla nélkül frissítések sikertelen. Az ideiglenes tábla jön létre az adatbázis könyvtárban az új tábla. Ez eltérhet az adatbázis könyvtárban a forrás tábla, ha az ALTER TABLE utasítás segítségével átnevezés az asztalra, hogy egy másik adatbázisba.

Ha az üzemeltető ALTER TABLE tbl_name Átnevezés new_tbl_name nincs más lehetőség, MySQL egyszerűen átnevezi a fájlokat, hogy tartoznak a táblázat tbl_name. (Átnevezése asztal, akkor is használhatja a Tábla átnevezése. Lásd. Fejezet 11.1.9 „Tábla átnevezése Syntax”.) Kiváltságait kifejezetten az átnevezett táblázatban fel nem vándoroltak be az új nevet. Ezeket meg kell változtatni manuálisan megadása és visszavonása nyilatkozatokat.

Ha az ALTER TABLE utasítás bármely más lehetőségeket átnevezés, MySQL mindig létrehoz egy ideiglenes táblát, még akkor is, ha az adatokat nem akar másolni (például, ha változtatni a nevét, a oszlop). MyISAM táblákhoz, akkor felgyorsíthatjuk újjáépítése az indexek (ez a leglassabb része a változási folyamat) számára a rendszer telepítése változó myisam_sort_buffer_size nagyobb mértékű.

Információ lehetséges probléma, ha az ALTER TABLE utasítás cm. Szakaszban B.1.7.1. "Problémák ALTER TABLE".

ALTER TABLE t1 MOTOR = InnoDB;

A siker megpróbálja megváltoztatni az asztal tároló motor attól függ, hogy a kijelölt tárolási rendszert, hogy az SQL NO_ENGINE_SUBSTITUTION Mi létre mód áll rendelkezésre. pontban leírtak szerint 5.1.7 „Server SQL módok”.
Mivel verzió MySQL 5.0.23, hogy véletlenül ne adatvesztés ALTER TABLE utasítás nem lehet megváltoztatni a táblázat a tárolórendszer vagy összeolvad BlackHole.
Ha módosítani AUTO_INCREMENT számláló. használt új sorokat, akkor a következő kifejezést:

ALTER TABLE t2 AUTO_INCREMENT = érték;

Lehetetlen a számlálót érték kisebb vagy egyenlő, mint a maximális érték között az elsődleges kulcs az adatokban lévő táblázatban. Ha MyISAM -Table beállított érték kisebb vagy egyenlő, mint a jelenlegi maximális értéket AUTO_INCREMENT oszlopban a beállított érték lesz az egyik, hogy meghaladja a jelenlegi maximális értéket. Mert InnoDB -Table üzemeltető használhatja ALTER TABLE. AUTO_INCREMENT = érték. verzió óta MySQL 5.0.3, de ha az érték kisebb, mint a jelenlegi maximális érték egy oszlopban, akkor egy hibaüzenet nem fordul elő, és az aktuális érték nem változik.
  • Használhatja több tervez ADD. ALTER. DROP, és a változás az állítás ALTER TABLE. elválasztva őket vesszővel. Ez egy MySQL kiterjesztés a szabványos SQL, amely lehetővé teszi, hogy csak egy-egy kikötés egy ALTER TABLE. Például törölni több oszlop egyetlen paranccsal, akkor a következő kifejezést:

    ALTER TABLE t2 DROP C oszlop, csepp D oszlop;

  • Építőipari VÁLTOZÁS COL_NAME. DROP COL_NAME és DROP INDEX - MySQL kiterjesztés az SQL szabványnak.
  • Kulcsszó Módosítása - kiterjesztése Oracle ALTER TABLE utasítás.
  • Kulcsszó oszlop opcionális, és elhagyható.
  • Rész column_definition a felvétele és módosítása záradékok ugyanazt a szintaxist használja, mint a CREATE TABLE utasítás. Lásd. Szakasz 12.1.10, "CREATE TABLE Syntax".
  • Nevezze oszlop segítségével az építési VÁLTOZÁS old_col_name new_col_name column_definition. Ehhez adja meg a régi és az új oszlop nevét, és a jelenlegi tulajdonságait. Például, átnevezel INTEGER oszlop A-ból B, használja a következő kifejezés:

    ALTER TABLE T1 változtatni egy B integer;

    Ha meg akarjuk változtatni csak a típusát oszlopban állítsa szintaxis továbbra is szükség van a régi és az új oszlop nevét, annak ellenére, hogy azok megegyeznek. Például:

    ALTER TABLE t1 VÁLTOZÁS b b BIGINT NOT NULL;

    Megváltoztatásához csak az oszlop-típus is használható anélkül, hogy átnevezés MODIFY szerkezetét.

    ALTER TABLE t1 MÓDOSÍTANI b BIGINT NOT NULL;

  • Amikor a megváltoztatására vagy módosítására folyamat csökkenti az adatok hossza az oszlop, amelynek az index és a kapott hossza kisebb, mint az index hossza, MySQL automatikusan csökkenti a méretét.
  • Ha megváltoztatni vagy módosítani műveletek megváltoztatni a típusát, MySQL megpróbálja konvertálni a meglévő oszlop értékeit az új típusú adatokat.

    Felhívjuk figyelmét,
    Ez az átalakulás vezethet adatsérüléshez. Például, az adatokat fel lehet méretre vágni csökkenő karakterlánc oszlopon. Annak érdekében, hogy műveleteket adatok átalakítása, ami azt eredményezi, hogy a veszteség, az SQL-módban meg kell tartalmaznia „szigorú”, hogy használja az ALTER TABLE utasítás (lásd. 5.1.6 pont, „SQL módok”).

    Felhívjuk figyelmét,
    InnoDB tárolási mechanizmus nem veszi figyelembe IRODALOM kialakítások alkalmazása szempontjából meghatározó oszlopot. IRODALOM szerkezet csak akkor lehet használni, ha az idegen kulcs meghatározása.

  • InnoDB támogatja a ALTER TABLE utasítással, hogy távolítsa el az idegen kulcsokat:

    ALTER TABLE tbl_name DROP IDEGEN KULCS fk_symbol;

    További információért lásd. Szakasz 13.2.4.4, „idegen kulcs kényszerek”.
  • Nem lehet hozzáadni vagy törölni az idegen kulcsokat egy ALTER TABLE utasítás. Ehhez használjon külön nyilatkozatokat.
  • Mert InnoDB táblákat. létrehozása saját tablespace a .ibd fájlt, hogy a fájl lehet dobni és az importált. Letiltásához .ibd fájlt, használja a következő kifejezést:

    ALTER TABLE tbl_name VISSZADOBÁSI TABLESPACE;

    Ez a művelet törli az aktuális .ibd fájlt, így biztos, hogy van egy tartalék első. Próbál hozzáférni az asztalra, míg a tablespace fájl hibát okoznak.
    Importálni a táblázat .ibd backup fájlt. másold be az adatbázis könyvtárba, és futtassa a következő kifejezést:

    ALTER TABLE tbl_name IMPORT TABLESPACE;

    Lásd. Fejezet 13.2.2.1, "A Per-táblázat Tablespace".
  • Található, a futási sorban szereplő INSERT DELAYED kikapcsol, ha az ALTER TABLE utasítás megváltoztatja a szerkezetét az asztalra.
  • Ahhoz, hogy változtassa meg az alapértelmezett kódolást a táblázat és az összes szöveges oszlop (.. CHAR VARCHAR TEXT), használja a következő kifejezést:

    ALTER TABLE tbl_name CONVERT karakterkészlet charset_name;

    Hangszóró típusa VARCHAR, vagy egy család adattípusok SZÖVEG művelet CONVERT karakterkészlet változás típusú adatokat úgy, hogy az oszlop tartalmazhat annyi karaktert a változás előtt a kódolást. Például, egy oszlop típusa SZÖVEG két bájt van hozzárendelve információ tárolására a hossz bájtban, ami ebben az esetben nem lehet több, mint 65535 Abban az esetben kódoló latin1 tárolására minden karakter megköveteli egy bájt, így SZÖVEG típus oszlop tartalmazhat kódoló latin1 maximum 65535 karakter. Ha átkódoljon oszlop utf8. A tároló egy szimbólum szükséges három bájt, de szüksége van a 3 × 65.535 = 196.605 byte tárolja a lehető legnagyobb ilyen típusú karakterek száma. Ez az összeg meghaladja a hossz bájtban, amely tartalmazhat szöveget adattípust. Azonban MySQL átalakítja adattípust MEDIUMTEXT. ami a legkisebb string típusú, amelyre az adatok bájtban lehet 196,605. Hasonlóképpen írja VARCHAR oszlop lehet alakítani MEDIUMTEXT.
    Megváltoztatásának megakadályozására adattípusok fent leírtak nem használják a művelet CONVERT karakterkészlet. Ehelyett használja Módosítása változtatni az egyes oszlopokat. Például:

    ALTER TABLE t MODIFY latin1_text_col karakterkészlete utf8;
    ALTER TABLE t MODIFY latin1_varchar_col VARCHAR # 40; M # 41; CHARACTER SET utf8;

    Ha rámutatni egy CONVERT karakterkészlet bináris. oszlop CHAR típusú. VARCHAR és SZÖVEG alakítjuk át a megfelelő bináris sztring típusú (binary. VARBINARY. BLOB). Ez azt jelenti,. hogy az oszlopok már nem a kódolás és az azt követő Átalakítás művelet nem vonatkoznak rájuk.
    Ha a jelzett érték charset_name DEFAULT. Meg fogják használni az adatbázis kódolását.

    Felhívjuk figyelmét,
    Átalakítás művelet átalakítja az adatokat egy kódolási a másikra. Ez ahhoz vezethet, hogy a nemkívánatos következményekkel, amikor az egyik oszlopban a kódolás (például, latin1), és az adatokat valóban van néhány más kódolási összeegyeztethetetlen az első (például, utf8). Ebben az esetben a következő parancsokat kell futtatni minden ilyen oszlop:

    ALTER TABLE t1 MÓDOSÍTÁSA c1 c1 BLOB;
    ALTER TABLE t1 MÓDOSÍTÁSA C1 C1 karakterkészlete utf8;

    Az ok, hogy e tevékenységek, hogy az átalakítás az adatok vagy egy bináris típusú átalakítás közötti kódolás következik be.

    Ahhoz, hogy változás csak a kódolási táblázat alapértelmezés szerint az alábbi kifejezést:

    ALTER TABLE tbl_name alapértelmezett karakterkészlet charset_name;

    DEFAULT kulcsszó opcionális. Az alapértelmezett karakterkódolás meghatározza, hogy fogják használni a későbbi hozzáadásával az oszlop nélküli kifejezett azt kódoló (például, via ALTER TABLE utasítás. ADD oszlop).

  • alkalmazásával mysql_info # 40; # 41; C API függvény segítségével határozza meg, hogy hány sor másolták, és (ha MELLŐZ használunk), hány sort miatt törölte a párhuzamos egyedi kulcs. Lásd. Szakasz 20.9.3.35 "mysql_info ()".

    Az alábbi példák szemléltetik a használata ALTER TABLE utasítás. Először hozzon létre egy táblázatot t1 az alábbiak szerint:

    CREATE TABLE t1 # 40; Egy INTEGER, b CHAR # 40; 10 # 41; # 41; ;

    Átnevezni az asztalra a T1-T2:

    ALTER TABLE t1 RENAME t2;

    Megváltoztatni egy oszlopot egész szám tinyint NOT NULL (anélkül, átnevezés) és b oszlopok változások CHAR # 40; 10 # 41; CHAR # 40; 20 # 41;. mint átnevezés azt a b c:

    ALTER TABLE t2 módosítására tinyint NOT NULL. VÁLTOZÁS b c CHAR # 40; 20 # 41; ;

    Ahhoz, hogy egy új oszlopot típusú d TIMESTAMP:

    ALTER TABLE t2 ADD d TIMESTAMP;

    Ahhoz, hogy hozzá az oszlop index d és egy egyedi index, hogy az oszlop egy:

    ALTER TABLE t2 ADD INDEX # 40; d # 41;. ADD UNIQUE # 40; egy # 41; ;

    Törléséhez C oszlop:

    ALTER TABLE t2 DROP C oszlop;

    Ahhoz, hogy egy új oszlopot az egész szám AUTO_INCREMENT c:

    ALTER TABLE t2 ADD c INT aláíratlan NOT NULL AUTO_INCREMENT,
    Elsődleges kulcsot # 40; c # 41; ;

    Kérjük, vegye figyelembe, hogy mi történt az elsődleges kulcs oszlop c, mint a táblázatban csak egy lehet AUTO_INCREMENT oszlopot akkor kell a kulcsot. Mivel az elsődleges kulcs nem tud NULL értékeket, az általunk definiált oszlop NOT NULL.

    Ha hozzáad egy AUTO_INCREMENT oszlop automatikusan tölti be egymást követő értékeinek egészek. MyISAM -Table megadhatja a nagysága az első érték elvégzésével SET insert_id = érték parancs előtt a ALTER TABLE vagy használja AUTO_INCREMENT = érték táblázatban opciót. Lásd. 5.1.4 „Session Rendszer változók”.

    Abban az esetben, MyISAM -Table, ha nem változik a AUTO_INCREMENT oszlop, a sorszám nem változik. Ha a csepp egy AUTO_INCREMENT oszlopot, majd egy újabb AUTO_INCREMENT oszlopban a számok indul, hogy töltse ki a készüléket.

    Ha replikáció kívül AUTO_INCREMENT oszlop nem garantálja az azonos sorrendben mindkét master és slave. Poishodit Ez annak a ténynek köszönhető, hogy a sorrendben a számozását vonalak függ a jellemzői a tárolórendszer használt asztal és sorrend, amelyben a vonalak kerültek az asztalra. Ha fontos, hogy ugyanabban a sorrendben szerepeljenek a master és a slave a húr kell megrendelni kiosztása előtt egy AUTO_INCREMENT számát. Tegyük fel, hogy szeretne hozzáadni AUTO_INCREMENT oszlop a táblázat t1. ez a kijelentés az új tábla t2 azonos t1. de mivel AUTO_INCREMENT oszlop:

    CREATE TABLE t2 # 40; id INT AUTO_INCREMENT PRIMARY KEY # 41;
    SELECT * FROM t1 ORDER BY col1, col2;

    Itt azt feltételezzük, hogy a táblázat t1 oszlopai col1 és col2.

    Az alábbi állítások is készít egy új táblát t2 azonos t1. de mivel AUTO_INCREMENT oszlop:

    CREATE TABLE t2 mint a T1;
    ALTER TABLE T2 ADD id int AUTO_INCREMENT PRIMARY KEY;
    INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;

    Felhívjuk figyelmét,
    Annak biztosítása ugyanabban a sorrendben szerepeljenek a master és a slave-összes oszlopot a táblázat t1 kell hivatkozni a ORDER BY.

    Függetlenül attól, hogy milyen módszerrel létrehozni és feltölteni a másolat, amely AUTO_INCREMENT oszlopban az utolsó lépés az eltávolítása az eredeti példányban átnevezés asztalok, és:

    DROP t1;
    ALTER TABLE t2 RENAME t1;

    Kapcsolódó cikkek