atomic 3 Report post Posted December 5, 2013 Salam semua & selamat pagi... Sebelum saya tanya kat sini, saya dah google, tapi tak juga jumpa cara selesaikan masalah nih. Soalan : mcm mana nak cek duplicate key dalam table. contoh: Table:table_A Primary key yang ada skrg: 1,2,3 Kebiasaan bila nak insert statement sy akan + 1. nextID= "select max(ID)+1 as nextID from table_A" query=" insert into table_A (ID) VALUES (nextID)" Masalah skrg table ni ramai yang guna, so select max+1 asyik duplicate. ada yg masukan ID suka hati. ada tak cara boleh cek duplicate key sebelum insert. contoh: nextID= "select max(ID)+1 as nextID from table_A" ....katakan ID skrg dapat "3" query=" insert into table_A (ID) VALUES (nextID)" if fail...cuba +1 lagi.. nextID= "select max(ID)+1 as nextID from table_A" ....kata ID skrg dapat "4" query=" insert into table_A (ID) VALUES (nextID)" part if fail tu,ada tak teknik untuk cek duplicate key? ada idea tak? minta tolong pakar2 sekelian.. dah buntu.. Quote Share this post Link to post Share on other sites
Chuki2 32 Report post Posted December 6, 2013 Dalam SQL SERVER mempunyai function yang dipanggil EXISTS. Jadi apa bro boleh buat, cuba try seperti dibawah. IF EXISTS (select * from table_A where ID= "id nak search" ) select 'Records is exists' ELSE --Do insert statement P/S : Kenapa x pakai auto increment? Cm susah2 jer.... :18: Quote Share this post Link to post Share on other sites
atomic 3 Report post Posted December 6, 2013 tq coz reply... sebab apa tak guna auto increment? dulu org lain buat, dia guna generate random number untuk jadikan primary key dia. Bila dah ambik alih,primary key dia dah terabur sebab random number tu. Penyelesaian, saya guna MAX+1.. tapi tak semua page dah guna MAX+1,ada yg masih guna generate random number tuh. kembali pada soalan, katakan saya guna IF NOT EXISTS dalam stored procedure, DECLARE @nextID INT select @nextID=isnull(max(ID)+1,1) from dbo.table_A IF NOT EXISTS (select ID from table_A where ID= @nextID) BEGIN insert into table_A (ID) VALUES (@nextID) END ELSE SET @nextID = @nextID + 1 soalan: macam mana nak LOOP? kiranya dia akan LOOP sampai jumpa key yg tak guna lagi,then baru insert.. ke ada cara lagi senang? A Quote Share this post Link to post Share on other sites
Chuki2 32 Report post Posted December 6, 2013 tq coz reply... sebab apa tak guna auto increment? dulu org lain buat, dia guna generate random number untuk jadikan primary key dia. Bila dah ambik alih,primary key dia dah terabur sebab random number tu. Penyelesaian, saya guna MAX+1.. tapi tak semua page dah guna MAX+1,ada yg masih guna generate random number tuh. kembali pada soalan, katakan saya guna IF NOT EXISTS dalam stored procedure, DECLARE @nextID INT select @nextID=isnull(max(ID)+1,1) from dbo.table_A IF NOT EXISTS (select ID from table_A where ID= @nextID) BEGIN insert into table_A (ID) VALUES (@nextID) END ELSE SET @nextID = @nextID + 1 soalan: macam mana nak LOOP? kiranya dia akan LOOP sampai jumpa key yg tak guna lagi,then baru insert.. ke ada cara lagi senang? A Owh senang je, Try buat macam nie... DECLARE @intFlag INT DECLARE @nextID INT SET @intFlag = 0 WHILE (@intFlag = 0) BEGIN IF NOT EXISTS (select ID from table_A where ID= @nextID) BEGIN insert into table_A (ID) VALUES (@nextID) SET @intFlag = 1 -- Tukar satu, nanti dia loop dan tengok tak sama dengan 0 so dia akan exit dari loop END ELSE SET @nextID = @nextID + 1 SET @intFlag = 0 -- Sekiranya 0, kita pusing lagi.... END GO Ok bro, ini cara dia while. Try dulu, sebab aku x smpt nak try... Tapi caranya lebih kurang macam nie. So kita ada satu variable dipanggil sebagai intFlag. Jadi pada awalnya kita set dia sebagai 0. Apabila code execute, dia akan pusing. Selagi tak sama dengan 1, selagi itu dia akan berpusing. Sampai jumpa NOT EXISTS, baru dia akan declare 1 dan stop. Then, gudluck... :153: Quote Share this post Link to post Share on other sites
atomic 3 Report post Posted December 9, 2013 (edited) thanks bro atas ilmu yang di kongsi.. cuma ada masalah sikit.. mb kalau tgk stored procedur faham kot.. sp_table_A: ALTER PROCEDURE sp_table_A @TableName varchar(150) AS DECLARE @intFlag INT DECLARE @nextID INT exec @nextID=sp_GetUniqueID @TableName SET @intFlag = 0 WHILE (@intFlag = 0) IF NOT EXISTS (select ID from table_A where ID= @nextID) BEGIN insert into table_A (ID) VALUES (@nextID) SET @intFlag = 1 END ELSE SET @nextID = @nextID + 1 SET @intFlag = 0 sp_GetUniqueID: ALTER PROCEDURE sp_GetUniqueID @TableName varchar(150) AS BEGIN declare @NextId bigint select @NextId=NextId from tblUniqueID where TableName=@TableName update tblUniqueID set NextId=NextId+1 where TableName=@TableName SELECT @NextId as NextId END Persoalan: kenapa *@nextID tak dapat value yang di exec?* dalam stored procedur sp_table_A ke salah cara saya? mohon tunjuk ajar... UPDATE: Alhamdulillah.. dah boleh.. punca sp_GetUniqueID tak rerurn value.. aku tambah return (@NextId) dalam sp_GetUniqueID. Ke salah cara nih? Edited December 10, 2013 by atomic Quote Share this post Link to post Share on other sites
Chuki2 32 Report post Posted December 11, 2013 thanks bro atas ilmu yang di kongsi.. cuma ada masalah sikit.. mb kalau tgk stored procedur faham kot.. sp_table_A: ALTER PROCEDURE sp_table_A @TableName varchar(150) AS DECLARE @intFlag INT DECLARE @nextID INT exec @nextID=sp_GetUniqueID @TableName SET @intFlag = 0 WHILE (@intFlag = 0) IF NOT EXISTS (select ID from table_A where ID= @nextID) BEGIN insert into table_A (ID) VALUES (@nextID) SET @intFlag = 1 END ELSE SET @nextID = @nextID + 1 SET @intFlag = 0 sp_GetUniqueID: ALTER PROCEDURE sp_GetUniqueID @TableName varchar(150) AS BEGIN declare @NextId bigint select @NextId=NextId from tblUniqueID where TableName=@TableName update tblUniqueID set NextId=NextId+1 where TableName=@TableName SELECT @NextId as NextId END Persoalan: kenapa *@nextID tak dapat value yang di exec?* dalam stored procedur sp_table_A ke salah cara saya? mohon tunjuk ajar... UPDATE: Alhamdulillah.. dah boleh.. punca sp_GetUniqueID tak rerurn value.. aku tambah return (@NextId) dalam sp_GetUniqueID. Ke salah cara nih? Salam bro, sorry lambat reply... Kalau bro nak dapatkan value, wajib kena ada return statement.. Tapi saya kurang faham, kenapa ada sp_getuniqueid tersebut? Quote Share this post Link to post Share on other sites
atomic 3 Report post Posted December 12, 2013 (edited) Wassalam.. sp_getuniqueid? ini idea je la.. skrg aku nak pantau table mana dah sampai max int... sebab aku nak ubah semua yg dah sampai max int ke big int.. so apa aku buat, aku wujudkan satu table,cuma ada dua field sahaja. Table:tblUniqueID fields: NextId , TableName contoh value yang ada dalam field: TableName=table_A nextid=889343471 TableName=table_C nextid=664065 katakan table_A nak insert, dia akan hantar nama table ke sp_GetUniqueID , then sp update table tblUniqueID and return value. sama juga dengan table_C,proses sama juga perlu lakukan.. tujunnya aku nak pantau table mana dah nak sampai max int tak perlu la aku select satu2 table nak check.. ke dalam sql server dah ada function untuk check? kalau ada kongsi la.. kalau cara ni kurang berkesan,mohon tunjuk ajar.. Edited December 12, 2013 by atomic Quote Share this post Link to post Share on other sites
umarzuki 78 Report post Posted December 16, 2013 kalau untuk mentenen dan optimization bro boleh cuba tool macam toad for ms sql dan seangkatan. Quote Share this post Link to post Share on other sites
Chuki2 32 Report post Posted December 18, 2013 So katakan ko dah dapat MAX INT. Apa next step akan dibuat? Sorry lambat balas. Quote Share this post Link to post Share on other sites
atomic 3 Report post Posted December 19, 2013 contoh keadaan skrg, bila aku monitor mana table dah nak capai max int, aku akan tukar kepada big int... so mana2 sp yg terlibat boleh ambik maklum la atas perubahan tu. Quote Share this post Link to post Share on other sites