Jump to content

Recommended Posts

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..

 

 

 

 

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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:

Share this post


Link to post
Share on other sites

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 by atomic

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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 by atomic

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...