Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Insert stranog kljuca kada je primarni kljuc auto increment.

[es] :: MS SQL :: Insert stranog kljuca kada je primarni kljuc auto increment.

[ Pregleda: 3058 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 13:18 - pre 141 meseci
Imam tabelu ucenik i tabelu fakultet.

tabela ucenik ima primarni kljuc(integer) UcenikID i kolonu Ime.

tabela fakultet ima strani kljuc UcenikID i kolonu Adresa.

Zelim da insertujem vrednosti u tabelu.

NPR:

Code:
INSERT INTO ucenik (UcenikID,Ime) Values (1,'Pera')
INSERT INTO fakultet (UcenikID,Adresa) Values (1,"Nikole Tesle 3")


Problem je u tome sto je meni primarni kljuc auto increment,
tako da ne znam kako da napravim script, jer ne znam sta da stavim kao foreign key u tabeli fakultet?


konkretno:
Code:
INSERT INTO ucenik (Ime) Values ('Pera') --primarni kljuc je auto increment
INSERT INTO fakultet (UcenikID,Adresa) Values (?????????,"Nikole Tesle 3")
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
109.121.58.*

Sajt: www.drinacoding.com


+14 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 13:24 - pre 141 meseci
Npr.
Code:
INSERT INTO ucenik (Ime) Values ('Pera')

DECLARE @UcenikId INT
SET @UcenikId = IDENT_CURRENT('ucenik')

INSERT INTO fakultet (UcenikID,Adresa) Values (@UcenikId,"Nikole Tesle 3")
 
Odgovor na temu

ventura

Član broj: 32
Poruke: 7781
*.dynamic.sbb.rs.



+6455 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 13:28 - pre 141 meseci
Code:

SET IDENTITY_INSERT ucenik ON
INSERT INTO ucenik (UcenikID,Ime) Values (1,'Pera')
SET IDENTITY_INSERT ucenik OFF
 
Odgovor na temu

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 13:44 - pre 141 meseci
Meni sledeci kod vraca NULL

Code:
SELECT IDENT_CURRENT('ucenik')


Pa shodno tome i ne radi.
Jel znas zasto vraca NULL?
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
109.121.58.*

Sajt: www.drinacoding.com


+14 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 14:02 - pre 141 meseci
Proveri da li ti se tabela zove tačno 'ucenik'.
Da li ta tabela ima polje koje je tipa INT i da li mu je podešen identity? Tip podatka može da bude i TINYINT, SMALLINT ili BIGINT.
Da greškom ne gađaš pogrešan server na kome ne postoji ta tabela?

Ovaj način koristim na puno mesta tako da kod sigurno radi.

Iz primera sam pretpostavio da je za jedan red u tabeli 'ucenik' vezan jedan ili ni jedan red iz tabele 'fakultet'. U tom slučaju tabeli 'fakultet' ne treba podesiti identity jer se id prepisuje iz tabele 'ucenik'.
Ako za jedan red u tabeli 'ucenik' treba da bude vezano više redova iz tabele 'fakultet' (one-to-many), onda u tabeli 'fakultet' treba dodati polje Id INT IDENTITY(1, 1) a relaciju čine polja UcenikID iz obe tabele.
Ovaj komentar nema veze sa problemom koji imaš. Problem je izazvan nekom sitnicom tipa onih na koje sam ti napisao da proveriš.
Pozdrav
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 14:24 - pre 141 meseci
Da prvo reformulisemo problem:
U tabelu Ucenik INSERTuje se novi red,.,
PK za tabelu Ucenik je Identity tipa, i mi ne znamo vrednost koja ce biti INSERTovana.
Da bismo uneli novi red u tabelu [Fakultet], potrebno je da znamo koji smo to identity dodelili novom redu u tabeli Ucenik.

Funkcija Curent_INsert nije dobar izbor. Treba upotrebiti Scope_Identity(). Izvod iz Books Online kazjue zasto:

Citat:

IDENT_CURRENT is similar to the SQL Server 2000 identity functions SCOPE_IDENTITY and @@IDENTITY. All three functions return last-generated identity values. However, the scope and session on which last is defined in each of these functions differ:

IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.

@@IDENTITY returns the last identity value generated for any table in the current session, across all scopes.

SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.

The IDENT_CURRENT function returns NULL when the function is invoked on an empty table or on a table that has no identity column.


Ako vise korisnika radi na bazi, moze se desiti da je jos neko INSERTovao red u tabelu [Ucenik] i tada nam Ident_Current moze vratiti PK koji je taj drugi korisnik kreirao. To ne bi vljalo, zar ne

Treba koristiti SCOPE_IDENTITY(), jer vraca poslednji identity generisan za bilo koju tabelu u tekucoj sesiji. Ako procitam SCOPE_IDENTITY() odmah posle INSERT naredbe, dobicu identity koji generisala bas ta MOJA naredba, a ne neka druga.

Ukratko, pravilo glasi:
1) da dobijem identiti, za bilo koju tabelu, a koji sam JA kreirao, koristim SCOPE_IDENTITY() odmah iza INSERT naredbe
2) da dobijem identity za odredjenu tabelu , a koji je kreirao bilo ko, ja ili neko drugi, korsitim IDENT_CURRENT tamo gde zelim da vidim vrednost identity

U zadatom primeru to bi izgledalo ovako:
Code:

DECLARE @UcenikId INT
INSERT INTO ucenik (Ime) Values ('Pera')
;
SET @UcenikId = Scope_identity()
;
INSERT INTO fakultet    (UcenikID,    Adresa) 
                Values    (@UcenikId,"Nikole Tesle 3")
;


Postoji situacija kada SCOPE_IDENTITY() i IDENT_CURRENT() daju prividno isti rezultat. To je kada niko drugi ne pristupa tabeli Ucenik osim onoga ko pise program. A to se desava UVEK kad smo jos uvek u fazi razvoja - niko drugi osim doticnog programera ne brlja po bazi, pa se dobije privid da SCOPE_IDENTITY() i IDENT_CURRENT() daju isti rezultat. Zato se ljudi prevare pa pomisle da je IDENT_CURRENT isto sto i SCOPE_IDENTITY(), a nije. Takve greske se tesko otkrivaju - kod radi, nista ne puca, samo sto se ponakad, ne uvek, adresa dodeli pogresnom studentu. Najgori je kod koji skoro uvek radi, ali ponekad, veome retko, zabrlja ponesto. IDENT_CURENT garantuje tu vrstu glavobolje.

Nadam se da je pomoglo.


 
Odgovor na temu

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Re: Insert stranog kljuca kada je primarni kljuc auto increment.31.07.2012. u 14:37 - pre 141 meseci
Hvala puno!!!
 
Odgovor na temu

[es] :: MS SQL :: Insert stranog kljuca kada je primarni kljuc auto increment.

[ Pregleda: 3058 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.