Stel ik heb een tabel bestaande uit meerdere kolommen..

Geen van de kolommen is echter een PK of uniek.

(Hoe) kan ik dan een specifiek record updaten in die tabel als de records precies dezelfde waarden hebben in elke kolom?

Mijn kolommen:
`waarde1`, `waard2`, `waarde3`

Mijn records:
1, 2, 3
3, 1, 2
2, 3, 1
1, 2, 3
1, 3, 2
1, 2, 3

Merk op dat records '1', '4' en '6' kwa inhoud niet van elkaar te scheiden zijn.

Hoe kan ik deze records 1 voor 1 toch aanpassen zonder dat ik moet werken met offsets, limits e.d.

Als ik met phpMyAdmin de record '4' wilde aanpassen, bedacht deze de query:


UPDATE `test_tabel` SET `waarde2` = '0' WHERE CONCAT( `waarde1` ) = '1' AND CONCAT( `waarde2` ) = '1' AND CONCAT( `waarde3` ) = '2' LIMIT 1 ;


dit is dus niet wat ik wil.. (maar deed me beseffen dat er waarschijnlijk niets anders op zit).
(Hoe) kan ik dan een specifiek record updaten in die tabel als de records precies dezelfde waarden hebben in elke kolom?

Leg mij eens uit wat er speciek is aan een record wanneer een ander record exact hetzelfde is.

Dit datamodel lijkt nergens op en is gedoemd te mislukken. Voeg nog even een kolom 'id' toe die je UNIQUE maakt en met auto_increment automatisch laat ophogen.

Wat je ook kunt doen, is de combinatie van de 3 kolommen UNIQUE maken. Dat betekent voor bovenstaand voorbeeld dat er diverse records moeten worden verwijderd. Maar dat is toch al een goed plan, het is volkomen zinloos om dezelfde gegevens meerdere keren op te slaan. Dat is ook niet het idee van een relationele database waar je data slechts 1x opslaat.
Het gaat om een script die records van onbekende tabellen (met onbekende indeling) moet kunnen updaten.

Ik heb geen controle over de opbouw van de tabel.. en in theorie kan een dergelijke opbouw voorkomen (of het slim is doet voor het betreffende script niet ter zake).

Het script zoekt nu eerst naar de primary key als reference, daarna naar een combinatie van alle unieke velden, maar als er ook geen unieke kolommen bestaan met ik een alternatief hebben.. en die probeer ik via deze vraag te vinden ;)
Ps: Wat het uitmaakt:

Als ik geen 'ORDER BY' gebruik pakt MySQL standaard de volgorde van invoegen.

Als de tabel fungeert als een 'stack' volgens het FIFO of FILO princiepe (of dit wederom slim is valt buiten de scope van de vraag) maakt het wel degelijk uit welk record ik aanpas.. de eerste, laatste, of een record ergens in het midden..
Nog een keertje: Hoe zou jij een uniek gegeven moet vinden in de volgende data:
1
1
1
1

Hoe moet je nu weten van welke 1 een 2 moet worden gemaakt? Om even een voorbeeldje te geven.

'een script die records van onbekende tabellen moet kunnen updaten' klinkt mij uitermate vaag in de oren. Je maakt 1x een datamodel en je kent ieder tabel van voor naar achter en van links naar rechts. Daar is niets onbekends aan. Ik ben erg benieuwd wat je nu aan het maken bent, snap er niets van.
Dat is dus precies mijn vraag :)

Ik wil bijvoorbeeld het '3e toegevoegde record' aanpassen.. mijn vraag is OF dat kan, en zo ja HOE :) (maar zoals ik al schreef vrees ik dat het niet kan..)

Maar 'onderwater' moet de engine van mysql toch soort van record references bijhouden die altijd uniek zijn.. kan ik die benaderen.. ik bedenk maar wat? :)
Owh, en wat ik maak: een zeer versimpelde vorm van phpMyAdmin ;)
'k heb zelf nog vrolijk verder gepuzzeld maar 'k heb nog geen 'bevredigende oplossing' kunnen vinden kan iemand mij uitsluitsel geven dat wat ik wil gewoon weg NIET mogelijk is? Of weet iemand hoe het wél kan?

i'm all ears (a)
wat jij wilt kan phpmyadmin ook niet
Ik heb het getest met deze tabel:

waarde 1     waarde 2     waarde 3
1            2            3
1            2            3
1            2            3
1            2            3

Ik klikte in de derde rij op edit en maakte van de 2 een 3
Phpmyadmin genereerde vervolgens deze code:
UPDATE `tabel` SET `waarde2` = '3' WHERE CONVERT( `waarde1` USING utf8 ) = '1' AND CONVERT( `waarde2` USING utf8 ) = '2' AND CONVERT( `waarde3` USING utf8 ) = '3' LIMIT 1 ;

En rij 1 werd ge-update
Toen was het dus

waarde 1     waarde 2     waarde 3
1            3            3
1            2            3
1            2            3
1            2            3


Conclusie: het is niet mogelijk en het slaat nergens op.
Wat Boris ook al zegt, en ik ook al eerder heb gezegd, wat jij wilt, gaat gewoon niet. Het werkt in theorie niet, laat staan in de praktijk. Als er niets uniek is aan een record, kun je nooit op basis van een uniek geven een bepaald record gaan opdaten. Er is geen uniek geven.
Tabel, kolom:
1
1
1

UPDATE tabel SET kolom = 2 WHERE kolom = 1

1x raden hoeveel records er worden bijgewerkt...

Zorg dus ALTIJD voor een uniek gegeven in een tabel, dan kun je records nog eens een keertje terug vinden en daar iets mee gaan doen.
@Pholeron, het is mogelijk je posts te editten, dan hoef je niet zoveel posts te plaatsen ;)

Reageren