Sintaxa ALTER TABLE
ALTER # 91; IGNORE # 93; tbl_name TABEL
alter_specification # 91;. alter_specification # 93;.
alter_specification:
table_option.
| ADD # 91; COLOANA # 93; column_definition COL_NAME
# 91; PRIMA | DUPĂ COL_NAME # 93;
| ADD # 91; COLOANA # 93; # 40; column_definition COL_NAME. # 41;
| ADD # 123; INDEX | CHEIE # 125; # 91; index_name # 93;
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; simbol # 93; # 93; PRIMARY KEY
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; simbol # 93; # 93;
UNIC # 91; INDEX | CHEIE # 93; # 91; index_name # 93;
# 91; index_type # 93; # 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; FULLTEXT | SPAȚIAL # 93; # 91; INDEX | CHEIE # 93; # 91; index_name # 93;
# 40; index_col_name. # 41; # 91; index_type # 93;
| ADD # 91; CONSTRAINT # 91; simbol # 93; # 93;
FOREIGN KEY # 91; index_name # 93; # 40; index_col_name. # 41;
reference_definition
| ALTER # 91; COLOANA # 93; COL_NAME # 123; SET DEFAULT literal | DROP DEFAULT # 125;
| SCHIMBARE # 91; COLOANA # 93; old_col_name new_col_name column_definition
# 91; PRIMUL | DUPĂ COL_NAME # 93;
| MODIFICARE # 91; COLOANA # 93; column_definition COL_NAME
# 91; PRIMA | DUPĂ COL_NAME # 93;
| DROP # 91; COLOANA # 93; COL_NAME
| DROP cheii primare
| DROP # 123; INDEX | CHEIE # 125; index_name
| DROP FOREIGN KEY fk_symbol
| CHEI DISABLE
| CHEI ENABLE
| REDENUMIȚI # 91; LA # 93; new_tbl_name
| COMANDA PRIN COL_NAME # 91;. COL_NAME # 93;.
| Transformați în setul de caractere charset_name # 91; COLLATE collation_name # 93;
| # 91; DEFAULT # 93; SET DE CARACTERE # 91; = # 93; charset_name # 91; COLLATE # 91; = # 93; collation_name # 93;
| RENUNȚAȚI TABLESPACE
| IMPORT TABLESPACE
index_col_name:
COL_NAME # 91; # 40; lungime # 41; # 93; # 91; ASC | DESC # 93;
index_type:
UTILIZAREA # 123; btree | HASH | RTREE # 125;
ALTER TABLE sintaxă, în multe cazuri similare cu sintaxa CREATE TABLE. Pentru mai multe informații, consultați. Secțiunea 11.1.5, "CREATE TABLE Sintaxa".
Dacă utilizați instrucțiunea ALTER TABLE pentru o modificări coloană, caietul de sarcini, dar DESCRIBE tbl_name indică faptul că coloana rămâne neschimbată, este posibil ca serverul MySQL a ignorat modificarea pentru unul dintre motivele descrise în secțiunea 11.1.5.1, „coloana Silent Specification Modificări“
În cele mai multe cazuri, ALTER TABLE funcționează prin a face o copie temporară a tabelului original. Modificările efectuate pe copia, apoi tabelul original este șters, iar cel nou este redenumit. În timp ce ALTER TABLE se execută, tabelul original, poate fi citită de către alți clienți. Actualizarea și scrierea datelor sunt păstrate în tabel până când noul tabel este gata, iar apoi transmis automat la noul tabel fără actualizări a eșuat. Tabelul temporar este creat în directorul bazei de date a noului tabel. Acesta poate diferi de directorul bazei de date a tabelului sursă, în cazul în care instrucțiunea ALTER TABLE cu ajutorul redenumirea tabelului într-o bază de date diferită.
Dacă utilizați operatorul ALTER TABLE tbl_name Redenumiți new_tbl_name fără alte opțiuni, MySQL redenumește pur și simplu fișierele care aparțin tbl_name de masă. (Pentru a redenumi un tabel, puteți utiliza, de asemenea TABLE REDENUMIRE. A se vedea. Secțiunea 11.1.9, „RENAME TABLE Sintaxa“.) Privilegiile acordate în mod specific pentru tabelul redenumit nu sunt migrate la noul nume. Ei trebuie să fie schimbate manual cu ajutorul grantului și REVOKE.
Dacă utilizați instrucțiunea ALTER TABLE cu orice alte opțiuni decât REDENUMIRE, MySQL creează întotdeauna un tabel temporar, chiar dacă datele nu ar dori să copieze (de exemplu, atunci când modificați numele coloanei). Pentru tabelele MyISAM, puteți accelera refacerea indicilor (este cel mai lent parte a procesului de schimbare) pentru instalarea variabila de sistem myisam_sort_buffer_size magnitudine mai mare.
Informații despre posibilele probleme atunci când folosesc ALTER TABLE cm. În secțiunea B.1.7.1. "Probleme cu ALTER TABLE".
ALTER TABLE t1 MOTOARE = InnoDB;
Succesul încercărilor de a schimba motorul de stocare de tabelă va depinde de faptul dacă mecanismul de stocare numit, și dacă SQL NO_ENGINE_SUBSTITUTION Stabilim modul este disponibil. așa cum este descris în secțiunea 5.1.7, „Moduri Server SQL“.
Deoarece versiunea MySQL 5.0.23, pentru a preveni pierderea accidentală a datelor ALTER TABLE nu poate fi folosit pentru a schimba tabelul din mecanismul de stocare sau MERGE Blackhole.
Pentru a schimba contorul AUTO_INCREMENT. utilizate pentru rânduri noi, efectuați următoarea expresie:
ALTER TABLE t2 AUTO_INCREMENT = valoare;
Este imposibil să se stabilească valoarea contorului este mai mică sau egală cu valoarea maximă între cheia primară conținută în tabelul de date. Dacă MyISAM -Table valoare mai mică sau egală cu valoarea maximă a curentului în coloana AUTO_INCREMENT set, setul de valoare va fi una să depășească valoarea maximă a curentului. Pentru InnoDB Operatorul -Table poate utiliza ALTER TABLE. AUTO_INCREMENT = valoare. din moment ce versiunea MySQL 5.0.3, dar în cazul în care valoarea este mai mică decât valoarea maximă curentă într-o coloană, apoi un mesaj de eroare nu va avea loc, iar valoarea curentă nu este schimbat.ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
ALTER TABLE t1 SCHIMBARE a b INTEGER;
Dacă doriți să modificați numai tipul de coloană, sintaxa SCHIMBARE necesită încă un vechi și noi nume de coloane, în ciuda faptului că acestea coincid. De exemplu:
ALTER TABLE t1 SCHIMBARE b b BIGINT NOT NULL;
Pentru a schimba doar tipul de coloană poate fi utilizată fără redenumirea structurii MODIFY.
ALTER TABLE t1 MODIFICARE b BIGINT NOT NULL;
Vă rugăm să rețineți
Această transformare poate duce la coruperea datelor. De exemplu, datele pot fi tăiate la lungime, cu scăderea coloanei șir. Pentru a se evita operațiunile privind conversia datelor, ceea ce va duce la pierderea lor, SQL mod este necesar să se includă „strict“ de a utiliza instrucțiunea ALTER TABLE (a se vedea. Secțiunea 5.1.6, „Moduri SQL“).
Vă rugăm să rețineți
Mecanismul de stocare InnoDB ignora REFERINTE folosesc modele în ceea ce privește determinarea coloanei. Structura de referințe pot fi utilizate numai în cazul în care definiția cheie externă.
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
Pentru mai multe informații, consultați. Secțiunea 13.2.4.4, „constrangeri“.ALTER TABLE tbl_name RENUNȚAȚI TABLESPACE;
Această operațiune elimină fișierul .ibd curent, astfel încât să fie sigur că aveți o copie de rezervă mai întâi. Încercarea de a accesa tabelul in timp ce fisierul TABLESPACE va cauza o eroare.
Pentru a importa tabelul .ibd fișierul copie de rezervă. copiați-l în directorul bazei de date și rulați următoarea expresie:
ALTER TABLE tbl_name IMPORT TABLESPACE;
A se vedea. Secțiunea 13.2.2.1, "Utilizarea Per-Tabelul Tablespaces".ALTER TABLE tbl_name Transformați în setul de caractere charset_name;
Tip difuzor VARCHAR, sau unul dintr-o familie de operare tipuri de date TEXT Transformați în setul de caractere tip de modificare a datelor, astfel încât coloana ar putea să conțină cât mai multe caractere ca înainte de schimbarea codificării. De exemplu, un tip de coloană TEXT doi octeți sunt alocate pentru stocarea informațiilor despre lungimea datelor în octeți, care în acest caz nu poate fi mai mult decât 65535. În cazul codificând latin1 pentru stocarea fiecărui caracter necesită un octet, deci pe o coloană de tip TEXT poate cuprinde codare latin1 până la 65535 de caractere. În cazul în care coloana transcodarea în utf8. depozitarea unui simbol necesare trei octeți, dar necesită 3 x 65.535 = 196605 octeți pentru a stoca maxim posibil pentru acel tip de număr de caractere. Această sumă depășește lungimea în octeți de date, care pot conține TEXT tip de date. Cu toate acestea MySQL convertește tipul de date MEDIUMTEXT. care este cel mai mic de tipuri de coarde, pentru care lungimea de date în octeți pot fi 196.605. In mod similar de tip coloană VARCHAR poate fi transformată în MEDIUMTEXT.
Pentru a preveni schimbarea tipurilor de date așa cum este descris mai sus nu utilizează convertitul operațiunea de a set de caractere. În schimb, utilizați MODIFY pentru a schimba coloanele individuale. De exemplu:
ALTER TABLE t MODIFY latin1_text_col utf8 TEXT CHARACTER SET;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR # 40; M # 41; utf8 SET CARACTER;
Dacă indicați o Transformați în PERSONAJ binare. Tipuri de coloană CHAR. VARCHAR și TEXT sunt convertite în tipuri corespunzătoare șir binar (BINARY. VARBINARY. BLOB). Acest lucru înseamnă. că coloanele nu mai au de codificare și Transformați ulterioare la operațiune nu li se vor aplica.
În cazul în care valoarea indicată charset_name DEFAULT. Acesta va fi utilizat de codificarea bazei de date.
Vă rugăm să rețineți
Transformați în funcțiune convertește datele de la o codificare la alta. Acest lucru poate duce la consecințe nedorite atunci când o coloană are o codificare (de exemplu, latin1), iar datele au de fapt o altă codificare este incompatibilă cu primul (de exemplu, utf8). În acest caz, următoarele comenzi trebuie să fie executați pentru fiecare astfel de coloană:
ALTER TABLE t1 SCHIMBARE c1 c1 BLOB;
ALTER utf8 TABLE t1 SCHIMBARE c1 c1 TEXT CHARACTER SET;
Motivul acestor acțiuni este faptul că are loc conversia datelor către sau de la o conversie de tip binar între codificare.
Pentru a modifica numai tabelul de codare în mod implicit, utilizați următoarea expresie:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
DEFAULT de cuvinte cheie este opțională. Codificarea caracterelor implicită determină că va fi utilizată pe adăugarea ulterioară a coloanei, fără o codificare explicită ea (de exemplu, prin ALTER TABLE. ADD coloana).
folosind mysql_info # 40; # 41; C funcții API, puteți determina câte rânduri au fost copiate, și (atunci când este folosit IGNORE) câte rânduri au fost șterse din cauza suprapunerii cheie unică. A se vedea. Secțiunea 20.9.3.35, "mysql_info ()".
Exemplele următoare ilustrează utilizarea ALTER TABLE. În primul rând, creați un tabel t1 așa cum se arată mai jos:
CREATE TABLE T1 # 40; un INTEGER, b CHAR # 40; 10 # 41; # 41; ;
Pentru a redenumi tabelul de la t1 la t2:
ALTER TABLE t1 REDENUMIRE t2;
Pentru a modifica o coloană INTEGER la tinyint coloane NOT NULL (fără redenumire) și b cu modificări CHAR # 40; 10 # 41; CHAR # 40; 20 # 41;. ca redenumirea de la b la c:
ALTER TABLE t2 MODIFICARE un TINYINT NOT NULL. SCHIMBARE b c CHAR # 40; 20 # 41; ;
Pentru a adăuga un nou tip de coloană d TIMESTAMP:
ALTER TABLE t2 ADD d TIMESTAMP;
Pentru a adăuga la index coloana D și un index unic pentru coloana A:
ALTER TABLE t2 ADD INDEX # 40; d # 41;. ADD UNIC # 40; o # 41; ;
Pentru a șterge o coloană c:
ALTER TABLE t2 DROP COLUMN c;
Pentru a adăuga o nouă coloană a unui întreg AUTO_INCREMENT c:
ALTER TABLE t2 ADD C INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY # 40; c # 41; ;
Vă rugăm să rețineți că am făcut primar cheie coloana c, la fel ca în tabel poate fi doar o singură coloană AUTO_INCREMENT și trebuie să fie cheia. Deoarece cheia primară nu poate lua valori NULL, ne-am definit ca o coloană NOT NULL.
Atunci când adăugați o coloană AUTO_INCREMENT este completată automat de valori succesive de numere întregi. Pentru MyISAM -Table poate specifica magnitudinea primei valori prin efectuarea SET INSERT_ID = comanda de valoare înainte de instrucțiunea ALTER TABLE sau folosind AUTO_INCREMENT = valoarea de tabelă. A se vedea. Secțiunea 5.1.4, "Variabile de sistem Session".
În cazul MyISAM -Table dacă nu schimbați coloana AUTO_INCREMENT, numărul de ordine nu este schimbat. Dacă scăpați o coloană AUTO_INCREMENT și apoi se adaugă o altă coloană AUTO_INCREMENT, numerele vor începe să se umple cu unitatea.
Atunci când se utilizează adăugarea de replicare coloana AUTO_INCREMENT nu garantează aceeași ordine pe ambele master și slave. Poishodit Acest lucru se datorează faptului că ordinea de numerotare a liniilor depinde de caracteristicile mecanismului de stocare utilizat pentru masă și ordinea în care liniile au fost adăugate la tabel. Dacă este important să avem aceeași ordine pe ambele master și slave, șirul trebuie să fie comandate înainte de a atribui un număr de AUTO_INCREMENT. Să presupunem că doriți să adăugați o coloană AUTO_INCREMENT la t1 tabel. această declarație noul tabel t2 identic cu T1. dar având coloană AUTO_INCREMENT:
CREATE TABLE t2 # 40; ID INT AUTO_INCREMENT cheie primară # 41;
SELECT * FROM COMANDA PRIN T1 col1, col2;
Aici se presupune că t1 tabel are coloane col1 și col2.
Următoarele afirmații vor produce, de asemenea, un nou t2 tabel identic cu T1. dar având coloană AUTO_INCREMENT:
CREATE TABLE t2 LIKE t1;
ALTER TABLE T2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * de la comanda T1 BY col1, col2;
Vă rugăm să rețineți
Pentru a garanta aceeași ordine pe ambele master și slave toate coloanele din tabelul t1 trebuie menționată în ORDER BY.
Indiferent de metoda utilizată pentru a crea și popula coloana AUTO_INCREMENT copie având, etapa finală este îndepărtarea exemplarelor originale ale redenumirea tabelelor și:
DROP T1;
ALTER TABLE t2 REDENUMIRE t1;