Ajutor - de - sql (LMD), cum să adăugați o nouă coloană la un tabel între coloanele existente

Nu este prima dată când am întâlni o întrebare pe forumuri despre cum să adăugați o nouă coloană într-un loc specific al unui tabel existent, de exemplu, între prima și a doua coloane. Acest lucru naiv în ceea ce privește modelul relațional întrebării, cu toate acestea, face un anumit sens din punct de vedere al limbajului SQL.

Eu spun „naiv“, deoarece, prin definiție, atributele relație nu sunt ordonate, și un apel la valorile atributului este realizată prin numele său, dar nu și de poziție. În ceea ce privește limbajul SQL, coloanele din tabel sunt de ordinul care este specificat în instrucțiunea CREATE TABLE. aceeași coloană nouă, care se adaugă utilizând instrucțiunea ALTER TABLE. Ea devine ultimul din tabel. Ie SQL standard nu prevede posibilitatea de a adăuga direct o coloană într-o anumită poziție în lista de coloane.

Este corect să spunem că unele implementări ale standardului limbajului SQL extinde în acest sens. De exemplu, în MySQL în instrucțiunea ALTER TABLE, puteți specifica poziția coloanei adăugată (o nouă coloană poate fi primul sau după coloana specificată).

O altă întrebare este, de ce este necesar? Mă pot gândi la o astfel de opțiune. De exemplu, aplicația client utilizat pentru a genera rapoarte precum interogare

Dacă doriți să adăugați tabelul de angajati pentru mai multe informații despre angajați, care în mod logic ar trebui să fie într-o anumită locație (de exemplu, primul nume direct între numele și prenumele), în loc de a face modificări la aplicațiile client, acesta poate fi mai ușor de a schimba structura tabelei de angajati.

Deci, există tabelul de angajati, care este creat cu următoarea declarație:

Acum vrem să adăugați o coloană middle_name (MI) între coloanele first_name și LAST_NAME.

În MySQL, acest lucru se poate face pur și simplu:

astfel încât este imposibil să se facă în SQL Server, dar puteți folosi următorul algoritm:

Mai jos sunt operatorii T-SQL. că punerea în aplicare a acestui algoritm.

Rețineți că coloana middle_name permite NULL valori. Nu putem adăuga o coloană la un tabel existent (sau, ca în cazul nostru, fără a specifica valoarea pentru această coloană la copierea datelor din tabelul Angajații din tabelul Emp_temp), în cazul în care nu are nici o valoare implicită. Aici vom accepta implicit NULL.

Putem realiza primele două etape într-un singur pas utilizând instrucțiunea SELECT INTO. că „on the fly“ creează un nou tabel:

Operatorul CAST ne permite să specificați imediat tipul dorit al coloanei adăugate. Tipurile de coloane rămase din moștenesc tabela sursă.

Dacă doriți să testați cele mai recente script-ul este un tabel la starea inițială prin eliminarea în prealabil a adăugat o coloană:

Rețineți că, atunci când se utilizează instrucțiunea SELECT INTO este cheile pierdute. Deci, trebuie să adăugăm o cheie primară constrângere (cheie primară), sau într-un tabel temporar, sau în redenumit deja pentru a obține exact structura dorită:

Același algoritm poate fi aplicat pentru deplasarea coloanelor existente. În plus față de acest motiv, o astfel de permutare poate îmbunătăți performanța asociată cu reducerea cantității de date scrise în jurnalul de tranzacții, în unele implementări. Acest lucru se datorează șirurile de prelucrare specifice de lungime fixă ​​și variabilă. Iată câteva recomandări cu privire la această chestiune dă Dzho Selko *:

„Primul loc coloane de lungime fixă ​​actualizate rar;
„Apoi așezați coloane actualizate rar de lungime variabilă;
„Ultimul loc frecvent coloane actualizate;
„Pune-o serie de coloane care sunt actualizate, de obicei, în același timp.