MYSQL – ÆNDRING, DROP, OMDØB, ÆNDRING
⚡ Smart opsummering
ÆNDRE, SLIP, OMDØB og MODIFICER er MySQL Kommandoer, der omformer en database, efter den allerede er i brug. De tilføjer, fjerner, omdøber og omdefinerer objekter såsom tabeller og kolonner uden at kassere de rækker, der allerede er gemt.

Hvad er ALTER-kommandoen i MySQL?
ÆNDRE En kommando ændrer en eksisterende database, tabel, visning eller andet databaseobjekt, der skal ændres i løbet af en databases livscyklus. Det er den kommando, der lader et skema udvikle sig, efter at det allerede er oprettet og fyldt med data.
Forretningskrav står sjældent stille, og et databasedesign skal følge med dem. Forestil dig, at designet til Myflix-databasen er blevet implementeret, og at brugerne arbejder med den, og først da indser teamet, at vigtige oplysninger er blevet udeladt. Ingen ønsker at miste de eksisterende rækker; de vil blot registrere de nye oplysninger ved siden af dem.
ALTER dækker præcis den situation. Det kan ændre datatypen for et felt fra en streng til et tal, omdøbe et felt eller tilføje en helt ny kolonne til en tabel, alt imens de data, der allerede er gemt i tabellen, forbliver intakte.
Når formålet med kommandoen er etableret, er det næste trin syntaksen, der udfører den.
MySQL ALTER-syntaks
Den grundlæggende syntaks, der bruges til at tilføje en kolonne til en tabel, der allerede findes, er vist nedenfor.
ALTER TABLE `table_name` ADD COLUMN `column_name` `data_type`;
HER
- "ÆNDRE TABEL `tabel_navn`" er kommandoen der fortæller MySQL server for at ændre tabellen med navnet `table_name`.
- "ADD COLUMN `column_name` `data_type`" er kommandoen der fortæller MySQL serveren for at tilføje en ny kolonne med navnet `kolonnenavn` med datatypen `datatype`.
Antag, at Myflix har introduceret online fakturering og betalinger. For at understøtte dette skal der tilføjes et felt til kreditkortnummeret til medlemstabellen. Før der foretages ændringer, er det værd at se på tabellens struktur, som den ser ud nu. Scriptet vist nedenfor gør det.
SHOW COLUMNS FROM `members`;
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde_navne | varchar(350) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
💡 Bemærkning om int(11): Tallet i parentes er kun en visningsbredde. MySQL 8.0.17 udfasede det for heltalstyper, så en moderne server rapporterer denne kolonne blot som intLagerpladsens størrelse er uændret.
Scriptet vist nedenfor tilføjer det nye felt til medlemstabellen.
ALTER TABLE `members` ADD COLUMN `credit_card_number` VARCHAR(25);
Hvis dette script udføres mod myflixdb, tilføjes en kolonne med navnet credit_card_number til medlemstabellen med VARCHAR som datatype. Hvis SHOW COLUMNS-scriptet køres igen, får du følgende resultat.
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde_navne | varchar(350) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL | |||
| kreditkortnummer | varchar(25) | JA | NULL |
Den fremhævede række bekræfter, at credit_card_number er blevet tilføjet til medlemstabellen, og at dataene, der allerede findes i de andre kolonner, ikke påvirkes af tilføjelsen.
At tilføje en kolonne er kun halvdelen af historien. Et skema skal også fjerne objekter, det ikke længere har brug for, hvilket er DROP-kommandoens opgave.
Hvad er DROP-kommandoen i MySQL?
DROP-kommandoen sletter et objekt permanent. Den bruges til at
- Slet en database fra MySQL server.
- Slet et objekt, f.eks. en tabel eller en kolonne, fra en database.
⚠️ Advarsel: DROP kan ikke reverseres. Hverken objektet eller rækkerne i det kan gendannes uden en sikkerhedskopi, så kør en SELECT mod målet og bekræft sikkerhedskopien først.
Dropping en kolonne
I ALTER-eksemplet ovenfor blev en kolonne med navnet credit_card_number tilføjet til medlemstabellen. Antag, at onlinefaktureringsfunktionen er udskudt, og at den kolonne skal fjernes igen. Følgende script gør det.
ALTER TABLE `members` DROP COLUMN `credit_card_number`;
Når scriptet udføres, fjernes kolonnen credit_card_number fra medlemstabellen. Når kolonnerne vises igen, bekræftes resultatet.
SHOW COLUMNS FROM `members`;
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde_navne | varchar(350) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
Kreditkortnummeret er væk fra feltlisten.
DROP TABEL
Syntaksen til at slette en hel tabel fra en database er som følger.
DROP TABLE `sample_table`;
Anvendt på et virkeligt objekt ser udsagnet således ud.
DROP TABLE `categories_archive`;
Hvis den udføres, slettes tabellen med navnet `categories_archive` og alle rækker i den fra databasen.
SLIP DATABASE
Det samme nøgleord fjerner et helt skema. Tilføjelse af IF EXISTS undertrykker fejlen, der MySQL hæves, når målet allerede er væk, hvilket er nyttigt i scripts, der kører mere end én gang.
DROP DATABASE IF EXISTS `myflixdb_backup`;
Fjernelse af et objekt er endelig. Når selve objektet skal bevares, og kun dets navn er forkert, er RENAME-kommandoen det korrekte værktøj.
Hvad er RENAME-kommandoen i MySQL?
Kommandoen RENAME ændrer navnet på et eksisterende databaseobjekt, f.eks. en tabel eller en kolonne, til et nyt navn. Omdøbning af en tabel medfører ikke, at den mister nogen af de data, der er indeholdt i den.
Kommandoen har følgende grundlæggende syntaks.
RENAME TABLE `current_table_name` TO `new_table_name`;
For at omdøbe tabellen movierentals til movie_rentals bruges scriptet nedenfor.
RENAME TABLE `movierentals` TO `movie_rentals`;
Hvis den udføres, omdøbes tabellen `movierentals` til `movie_rentals`. Da omdøbningen kun er en ændring af etiketten, gendanner den samme sætning, hvis den omvendt udføres, det oprindelige navn.
RENAME TABLE `movie_rentals` TO `movierentals`;
RENAME TABLE håndterer navnet på en tabel. Omdøbning af en kolonne, og at ændre, hvad den indeholder, er et resultat af nøgleordet CHANGE.
ÆNDR søgeord
Nøgleordet CHANGE giver dig mulighed for at
- Ændre navnet på en kolonne
- Ændr kolonnens datatype
- Ændr kolonnebegrænsningerne
Overvej et eksempel. Feltet full_names i medlemstabellen er af varchar-datatypen med en bredde på 350, som scriptet nedenfor bekræfter.
SHOW COLUMNS FROM `members`;
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde_navne | varchar(350) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
Antag at kravet er at
- Skift feltnavnet fra "fulde_navne" til "fuldt_navn"
- Skift den til char-datatypen med en bredde på 250
- Tilføj en NOT NULL-begrænsning
Alle tre redigeringer udføres af en enkelt CHANGE-sætning.
ALTER TABLE `members` CHANGE COLUMN `full_names` `fullname` char(250) NOT NULL;
At udføre det mod myflixdb og derefter køre SHOW COLUMNS-scriptet giver følgende resultat.
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde navn | røye (250) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
Kolonnen kaldes nu fullname, indeholder char(250) og afviser NULL-værdier.
ÆNDRE søgeord
Nøgleordet MODIFY giver dig mulighed for at
- Rediger kolonnedatatypen
- Rediger kolonnebegrænsningerne
I CHANGE-eksemplet ovenfor skulle feltnavnet angives to gange, selvom omdøbningen kun var en del af målet. Hvis feltnavnet udelades fra en CHANGE-sætning, genereres der en fejl. Når kun datatypen og begrænsningerne skal justeres, og navnet skal forblive, som det er, klarer MODIFY jobbet med én omtale af kolonnen.
Scriptet nedenfor ændrer bredden af feltet "fuldt navn" fra 250 til 50.
ALTER TABLE `members` MODIFY `fullname` char(50) NOT NULL;
Hvis du udfører det mod myflixdb og derefter kører scriptet SHOW COLUMNS, får du resultatet vist nedenfor.
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde navn | røye (50) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
⚠️ Advarsel: Indsnævring af en kolonne afkorter data, der ikke længere passer. Ethvert navn, der er længere end 50 tegn, afkortes af denne sætning, så tjek den længste eksisterende værdi med en SELECT forespørgsel før et felt krymper.
ÆNDRE vs. MODIFICER vs. OMDØB KOLONNE
De tre søgeord overlapper hinanden, og at vælge det forkerte søgeord er den mest almindelige kilde til fejl på dette område. Tabellen nedenfor viser dem side om side.
| Søgeord | Omdøber kolonnen | Ændrer type og begrænsninger | Gammelt navn påkrævet | Typisk brug |
|---|---|---|---|---|
| CHANGE | Ja | Ja | Ja, plus det nye navn | Omdøb og omdefiner i én sætning |
| MODIFICERE | Ingen | Ja | Navn givet én gang | Udvid, indsnævre eller omskriv en kolonne |
| OMDØB KOLONNE | Ja | Ingen | Ja, plus det nye navn | Omdøb kun, fra MySQL 8.0 og fremefter |
MySQL 8.0 tilføjede en fjerde mulighed for det enkleste tilfælde, et omdøb uden nogen omdefinering overhovedet.
ALTER TABLE `members` RENAME COLUMN `fullname` TO `full_name`;
Type og navn er afgjort. Det resterende spørgsmål er, hvor en ny kolonne skal placeres i tabellen, hvilket AFTER-nøgleordet styrer.
EFTER-nøgleord
Som standard lander en kolonne tilføjet med ALTER TABLE i slutningen af tabellen. For at placere den på en bestemt position i stedet kombineres ALTER-kommandoen med AFTER-nøgleordet.
Scriptet nedenfor tilføjer "date_of_registration" direkte efter date_of_birth i medlemstabellen.
ALTER TABLE `members` ADD `date_of_registration` date NULL AFTER `date_of_birth`;
Hvis du udfører det mod myflixdb og derefter kører scriptet SHOW COLUMNS, får du resultatet vist nedenfor.
| Felt | Type | Null | Nøgle | Standard | Ekstra |
|---|---|---|---|---|---|
| medlemsnummer | int (11) | INGEN | PRI | NULL | automatisk_forøgelse |
| fulde navn | røye (50) | INGEN | NULL | ||
| køn | varchar(6) | JA | NULL | ||
| fødselsdato | dato | JA | NULL | ||
| registreringsdato | dato | JA | NULL | ||
| fysisk adresse | varchar(255) | JA | NULL | ||
| postadresse | varchar(255) | JA | NULL | ||
| kontaktnummer | varchar(75) | JA | NULL | ||
| varchar(255) | JA | NULL |
Den fremhævede række er den kolonne, der tilføjes efter fødselsdato. Nøgleordet FIRST fungerer på samme måde og flytter den nye kolonne helt til forrest i tabellen.
