[SQL] Twee waardes uit een UNIQUE veld wissellen

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Mischien is er een vrij simpele oplossing voor maar ik zou nu niet direct weten hoe het gemakkelijk kan. Ik heb in een tabel een UNIQUE veld index waarin ik inderdaad bijhoud op welk index een bepaald record in bijvoorbeeld een lijstje moet komen te staan. Nu ben ik in een cms dat ik aan het maken ben een optie aan het bouwen om de indexen van records snel te wissellen. Nu wil ik van twee records tegelijk de index veranderen. record1 krijgt dus de index van record2 en visa versa. Hoe kan ik dit het beste doen. Het is volgens mij niet mogelijk om twee records tegelijk te updaten in 1 statement (in 1 tabel dan) en de enige andere oplossing die ik kan bedenken is om eerst de index van een record op te vragen, dan de waarde veranderen naar een waarde die waarschijnlijk nog niet bezet is (zeg -1234567890), dan de waarde van record 2 ophalen, dan de waarde daarvan veranderen in de oude waarde van record 1 en dan de waarde van record 1 veranderen in de waarde van record 2. Iemand die me een beetje kan helpen?

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Jouw oplossing is ook het eerste wat er in mij op komt, maar het kan vast beter. Als het om een primary key gaat en er zijn verder geen UNIQUE waarden, dan kun je ook alle andere velden juist omwisselen, maar ik heb het vermoeden dat dat geen optie is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 12:03
geef eens iet meer info, ik begrijp niet helemaal wat je wil bereiken ?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Een UNIQUE constraint mag je inderdaad nooit overtreden, zelfs tijdens een transaction niet, maar ik zou dan niet -1234567890 of zo pakken maar iets als dit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table #temp (
    temp_id int primary key identity(1,1),
    temp_unique int unique );
insert #temp (temp_unique) values (1);
insert #temp (temp_unique) values (2);
select * from #temp;

-- Truc vanaf hier
begin transaction
update #temp set temp_unique = (select max(temp_unique) + 1 from #temp) where temp_id = 1;
update #temp set temp_unique = 1 where temp_id = 2;
update #temp set temp_unique = 2 where temp_id = 1;
commit transaction

-- Check of het gelukt is!
select * from #temp;
drop table #temp;

Deze werkt namelijk gegarandeerd ;)

SQL Server code dit, als je met een of andere brakke DB zonder transactions werkt heb je pech dan is die wisseltruc niet safe :)

Professionele website nodig?


Verwijderd

Ik weet niet of onderstaande werkt voor elke SQL database, maar bij SQL Server werkt zoiets als dit prima:

code:
1
2
3
UPDATE tblTest
SET UniqueField = CASE WHEN UniqueField = @Value1 THEN @Value2 ELSE @Value1 END
WHERE UniqueField IN(@Value1, @Value2)

Hierbij is tblTest een tabel met een UNIQUE contraint op 'UniqueField'.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

* curry684 noteert stoere truc van EEBB d:)b

Professionele website nodig?


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Thanks voor de uitstekende oplossingen. Ik zal er zeker wat mee gaan doen. Ik post nog wel even de exacte manier die ik gebruikt heb. :)

Noushka's Magnificent Dream | Unity

Pagina: 1