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?
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.
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:
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
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
Verwijderd
Ik weet niet of onderstaande werkt voor elke SQL database, maar bij SQL Server werkt zoiets als dit prima:
Hierbij is tblTest een tabel met een UNIQUE contraint op 'UniqueField'.
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 noteert stoere truc van EEBB
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.
Pagina: 1