Kopiranje podataka iz jedne tabele u drugu (kreiranje nove tabele tokom kopiranja)
Uvod
Do sada bi trebalo da su učenici naučili kako da ubacuju podatke pomoću naredbe INSERT, kao i kako da prebacuju podatke iz jedne tabele u drugu koristeći INSERT INTO ... SELECT.
U ovom nastavku fokus se pomera na kopiranje sadržaja jedne tabele u drugu, pri čemu:
-
možemo kopirati samo određene redove,
-
možemo kopirati sve redove,
-
možemo tokom kopiranja automatski kreirati novu tabelu.
Ovo je česta praksa u realnim sistemima kada se pravi arhiva podataka, pravi rezervna kopija, priprema tabela za izveštaje ili testiraju izmene bez rizika po originalnu tabelu.
1. Kopiranje podataka u već postojeću tabelu
Podsetimo se osnovne sintakse:
INSERT INTO NovaTabela (kolone)
SELECT kolone
FROM PostojecaTabela
WHERE uslov;
Ovde:
-
NovaTabela mora već postojati
-
Struktura mora biti kompatibilna
-
Broj i tip kolona mora odgovarati
Primer 1 – Kopiranje svih redova: Pretpostavimo da imamo tabelu Ucenik, i želimo da napravimo radnu kopiju podataka u tabeli UcenikKopija.
INSERT INTO UcenikKopija (UcenikID, Ime, Prezime, Razred)
SELECT UcenikID, Ime, Prezime, Razred
FROM Ucenik;
Ovim se kopiraju svi podaci.
Primer 2 – Kopiranje samo određenih redova: Kopiranje samo učenika 4. razreda:
INSERT INTO Maturanti (UcenikID, Ime, Prezime)
SELECT UcenikID, Ime, Prezime
FROM Ucenik
WHERE Razred = 4;
Ovde se koristi filtriranje podataka pomoću WHERE uslova.
2. Kopiranje podataka uz kreiranje nove tabele
U mnogim SQL sistemima moguće je kreirati novu tabelu direktno iz SELECT upita pomoću naredbe:
SELECT ... INTO NovaTabela
FROM PostojecaTabela;
Ova naredba:
-
kreira novu tabelu
-
definiše kolone na osnovu SELECT izraza
-
ubacuje podatke u tu novu tabelu
Primer 3 – Kopiranje cele tabele:
SELECT *
INTO UcenikBackup
FROM Ucenik;
Rezultat:
-
Kreira se nova tabela UcenikBackup
-
Kopira se struktura kolona
-
Kopiraju se svi podaci
Ovo je najjednostavniji način pravljenja kopije tabele.
Primer 4 – Kopiranje sa uslovom
SELECT UcenikID, Ime, Prezime
INTO ArhivaPrvogRazreda
FROM Ucenik
WHERE Razred = 1;
Rezultat:
-
Kreira se nova tabela ArhivaPrvogRazreda
-
Sadrži samo učenike prvog razreda
-
Sadrži samo tri kolone
Napomena: nova tabela neće imati primarni ključ, ograničenja ni strane ključeve — samo kolone i podatke.
3. Razlika između dva pristupa
| INSERT INTO ... SELECT | SELECT INTO |
|---|---|
| Tabela mora postojati | Tabela se kreira |
| Koristi se za dodavanje u postojeću tabelu | Koristi se za pravljenje kopije |
| Struktura mora odgovarati | Struktura se automatski formira |
4. Primeri kada dolazi do greške
Greška 1 – Tabela već postoji (kod SELECT INTO)
Ako već postoji tabela UcenikBackup, sledeći upit:
SELECT *
INTO UcenikBackup
FROM Ucenik;
dovešće do greške jer sistem ne može da kreira tabelu koja već postoji.
Greška 2 – Neusklađen broj kolona
INSERT INTO Maturanti (UcenikID, Ime)
SELECT UcenikID, Ime, Prezime
FROM Ucenik;
Greška: broj kolona se ne poklapa.
Greška 3 – Neusklađeni tipovi podataka
Ako pokušamo:
INSERT INTO TestTabela (BrojKolona)
SELECT Ime
FROM Ucenik;
a BrojKolona je numerički tip, doći će do greške konverzije tipa.
Greška 4 – Dupliranje primarnog ključa
Ako tabela već sadrži redove sa istim primarnim ključem, kopiranje može izazvati grešku narušavanja integriteta.
5. Zadaci za vežbu
Zadatak 1: Napraviti kopiju cele tabele Ucenik pod nazivom UcenikTest koristeći SELECT INTO.
Zadatak 2: Kreirati novu tabelu TreciRazred i u nju kopirati sve učenike trećeg razreda.
Zadatak 3: U tabelu Maturanti (koja već postoji) ubaciti učenike četvrtog razreda koristeći INSERT INTO ... SELECT.
Zadatak 4 (analiza): Objasniti zašto sledeći upit daje grešku:
SELECT *
INTO Ucenik
FROM Ucenik;
Rešenja
Rešenje 1
SELECT *
INTO UcenikTest
FROM Ucenik;
Rešenje 2
SELECT *
INTO TreciRazred
FROM Ucenik
WHERE Razred = 3;
Rešenje 3
INSERT INTO Maturanti (UcenikID, Ime, Prezime)
SELECT UcenikID, Ime, Prezime
FROM Ucenik
WHERE Razred = 4;
Rešenje 4
Greška nastaje jer tabela Ucenik već postoji i ne može se ponovo kreirati pomoću SELECT INTO.
Napomene za kraj časa
Nakon ove lekcije trebalo bi da se razume:
-
Razlika između kopiranja u postojeću tabelu i kreiranja nove.
-
Da SELECT INTO ne prenosi ograničenja (PRIMARY KEY, FOREIGN KEY).
-
Da je kopiranje podataka česta profesionalna praksa.
DODATAK – Upiti za kreiranje i popunjavanje tabela
Kreiranje tabele Ucenik
CREATE TABLE Ucenik (
UcenikID INT PRIMARY KEY,
Ime VARCHAR(50),
Prezime VARCHAR(50),
Razred INT
);
Popunjavanje tabele Ucenik
INSERT INTO Ucenik VALUES (1, 'Marko', 'Markovic', 1);
INSERT INTO Ucenik VALUES (2, 'Jelena', 'Jovanovic', 2);
INSERT INTO Ucenik VALUES (3, 'Ana', 'Petrovic', 3);
INSERT INTO Ucenik VALUES (4, 'Nikola', 'Ilic', 4);
INSERT INTO Ucenik VALUES (5, 'Milica', 'Kovacevic', 4);
Kreiranje tabele Maturanti
CREATE TABLE Maturanti (
UcenikID INT PRIMARY KEY,
Ime VARCHAR(50),
Prezime VARCHAR(50)
);
Kreiranje prazne kopije strukture (primer alternativnog pristupa)
Ako želimo da kreiramo praznu tabelu istog tipa:
SELECT *
INTO UcenikPraznaKopija
FROM Ucenik
WHERE 1 = 0;
Ovo kreira strukturu bez podataka.