Izmena postojeće kolone u identity kolonu

Objavljeno: 11-09-2014 | Autor: Žana (Jovana) Baćović | Kategorija: T-SQL

Ознаке:

0

Identity kolona predstavlja kolonu kojoj SQL Server automatski dodjeljuje vrijednost (broj) iz niza brojeva kojim je definisan. Taj niz je definisan početnom vrijednošću i inkrementom tj. vrijednošću za koju se početna vrijednost uvećava prilikom unosa novog reda.
Prilikom kreiranja tabele, sintaksa za kreiranje identity kolone je sledeća:

CREATE TABLE dbo.TestKefalo
(ID INT IDENTITY(1,1));

Prvi broj u IDENTITY(1,1) predstavlja početnu vrijednost a drugi broj vrijednost inkrementa.
Analogno se u tabeli dodaje identity kolona, naredbom ALTER TABLE ADD.

Ukoliko smo već kreirali kolonu koja nije identity a želimo da bude, onda to ne može da se uradi ALTER TABLE ALTER COLUMN naredbom, već na drugačiji način.
U dizajneru SSMS-a postoji opcija promjene identity osobine, ali ta akcija u pozadini radi kreiranje i brisanje tabele koje će biti opisano u a) primjeru. Na ovaj način kontrolu prepuštate dizajneru, a za velike tabele koje broje stotine miliona slogova je ovaj način neprihvatljiv sa stanovišta performansi.

Tabele sa malim brojem podataka

Uzećemo tabelu dbo.Autori iz SQL_KEFALO baze, koja nije velika i koja nema identity kolonu. Ako želimo da kolona AutorID postane identity, to može da se uradi na sledeći način:
a) Kreira se nova tabela koja ima iste kolone kao dbo.Autori, pri čemu se za kolonu AutorID postavi da je identity:

CREATE TABLE dbo.AutoriPrivremena
        (AutorID INT IDENTITY(1,1) NOT NULL,
        Ime NVARCHAR (20),
        Prezime NVARCHAR (30),
        Nadimak NVARCHAR (20),
        CONSTRAINT PK_AutoriPrivremena  PRIMARY KEY CLUSTERED (AutorID)
        );

Nakon toga se podaci prebace u novokreiranu tabelu, uz omogućavanje inserta u identity kolonu:

SET IDENTITY_INSERT  dbo.AutoriPrivremena ON;
GO
INSERT  INTO dbo.AutoriPrivremena (AutorID,Ime,Prezime,Nadimak)
        SELECT  AutorID,Ime,Prezime,Nadimak
        FROM    dbo.Autori; 
GO
SET IDENTITY_INSERT dbo.AutoriPrivremena OFF;

Posle presipanja podataka, može da se obriše tabela dbo.Autori, kako bi mogla da se dbo.AutoriPrivremena preimenuje.
Pošto u našem primjeru tabela dbo.CrtaniFilmovi_Rel_Autori ima spoljašnji ključ na tabelu dbo.Autori, potrebno ga je obrisati i naknadno ponovo kreirati.

ALTER TABLE dbo.CrtaniFilmovi_Rel_Autori 
DROP CONSTRAINT FK_CrtaniFilmovi_Rel_Autori_Autori;
GO
DROP TABLE dbo.Autori;

Preimenovaćemo tabelu AutoriPrivremena i tabelu Autori uz pomoć sp_rename procedure.

EXEC sp_rename 'AutoriPrivremena', 'Autori';

Za naš primjer je potrebno i vratiti spoljašnji ključ:

ALTER TABLE [dbo].[CrtaniFilmovi_Rel_Autori]  WITH CHECK 
ADD  CONSTRAINT [FK_CrtaniFilmovi_Rel_Autori_Autori] FOREIGN KEY([AutorID])
REFERENCES [dbo].[Autori] ([AutorID]);
GO
ALTER TABLE [dbo].[CrtaniFilmovi_Rel_Autori] 
CHECK CONSTRAINT [FK_CrtaniFilmovi_Rel_Autori_Autori];

b) Ukoliko u identity kolonu ne moraju da se prepišu vrijednosti postojeće kolone već mogu da se zadaju vrijednosti kroz identity, onda bi drugi način bilo kreiranje nove kolone tipa identity u postojećoj tabeli.
Za tabelu dbo.Autori (kojoj vrijednosti u koloni AutorID počinju od 1001 pa dalje za 1 više) bi i za slučaj zadržavanja vrijednosti iz kolone AutorID vjerovatno bilo dovoljno da nova identity kolona ima početnu vrijednost 1001 i increment 1. Ne postoji garancija da će redosled biti kao u postojećoj, zavisi i od klastera. Nakon toga bi se obrisala kolona AutorID, a nova kolona preimenovala.

Tabele sa velikim brojem podataka

Ukoliko je tabela velika, navedene opcije će biti spore. U ovom slučaju je bolje primijeniti metodu zamjene metapodataka tabele, koristeći SWITCH naredbu.
Kreirajmo tabelu dbo.AutoriPrivremena kao u primjeru a).
Nakon toga je potrebno skloniti spoljašnji ključ na tabelu dbo.Autori a potom SWITCH naredbom izvršiti zamjenu metapodataka:

ALTER TABLE dbo.Autori SWITCH TO dbo.AutoriPrivremena;

Izvršavanjem naredbi SELECT iz obje tabele, možete utvrditi da tabela dbo.Autori nema podataka i da se podaci nalaze u tabeli dbo.AutoriPrivremena.

SWITCH

Nakon toga može da se radi brisanje i preimenovanje, kao što je opisano u primjeru a).

Naredba ALTER TABLE SWITCH se uobičajeno koristi za particionisane tabele koje treba da zadovolje određene uslove, ali može i za neparticionisane kao u ovom slučaju.