Toon posts:

[MySQL] Unique beide kanten op

Pagina: 1
Acties:
  • 195 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een tabel met een id (auto increment), een id_1 en een id_2 field.

Voor de velden id_1 en id_2 heb ik een unique key ingebouwd.
Nu kan bijvoorbeeld het volgende niet meer gebeuren:

id_1 id_2
1 2
1 2

Maar ik zou graag willen dat dit ook niet meer kan:

id_1 id_2
2 1
1 2

Dus ook omgekeerd.

Is dit mogelijk met enkel MySQL?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Volgens mij niet. Kun je, als volgorde blijkbaar niet uitmaakt (want dat impliceert je vraag), niet gewoon in je eigen software altijd ervoor zorgen dat je het kleinste getal in het eerste veld hebt staan?

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


Verwijderd

Topicstarter
Volgorde maakt idd niet uit.
Probleem is alleen dat ik dan gigantisch veel query's moet gaan aanpassen.
Of is hier een standaard functie voor?

  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Waarom 2 id's voor 1 tabel, als die samen toch 1 unieke sleutel vormen?

Kun je niet voor beide id's dezelfde sequence gebruiken?
Dan weet je in ieder geval zeker dat je niet dezelfde waardes zal (her)gebruiken.

Ik ben eigenlijk een Oracle developer; en kan dus niet voor 100% zeker zijn of dit in MySQL bestaat. Ik kan me het niet 1-2-3 voorstellen hoe je dit, zonder al te veel programmeren, kan realiseren.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 11 juli 2006 @ 18:33:
Volgorde maakt idd niet uit.
Probleem is alleen dat ik dan gigantisch veel query's moet gaan aanpassen.
Of is hier een standaard functie voor?
Gigantisch veel queries aanpassen? Voor het inserten in één tabel? :?
DND_Roche schreef op dinsdag 11 juli 2006 @ 18:44:
Waarom 2 id's voor 1 tabel, als die samen toch 1 unieke sleutel vormen?
Koppeltabel? ;)

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


Verwijderd

Topicstarter
Er zijn een heleboel manieren om koppeling in te voeren :).

  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Dan wil je toch niet letten op 1 2 / 2 1? :P

Verwijderd

Topicstarter
Het gaat om de koppeling tussen 2 leden.
Het veld id_1 is de id van user 1 en id_2 is de id van user 2.
Connecties kunnen op meerdere manieren gelegd worden, via meerdere wegen.

Gebruikers kunnen een lijst opgeven van e-mail adressen wie ze aan hun vrienden willen toevoegen.
Wanneer zowel gebruiker 1 als 2 dit doen worden ze dus 2x toegevoegd, dit is dus niet de bedoeling.

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 11:10
Misschien niet zo'n charmante oplossing, maar kun je als je mysql-versie het toelaat geen trigger schrijven die dit voor je afhandeld?

Verwijderd

Topicstarter
MySQL versie laat het niet toe.

  • Grum
  • Registratie: Juni 2001
  • Niet online
Als je nou in id_1 altijd het laagste id insert en een unique maakt op id_1+id_2, dan lijkt het me dat je probleem is opgelost :)

(dat zei -NMe- natuurlijk ook al .. maar daar wordt zo te zien overheen gelezen :P )

[ Voor 26% gewijzigd door Grum op 11-07-2006 21:12 ]


Verwijderd

Topicstarter
Nee hoor, want hoe zorg ik ervoor dat id_1 kleiner is dan id_2 zonder alle query's opnieuw te schrijven?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Niet. :) Dit is gewoon iets waar je in je ontwerp al aan had moeten denken. Overigens denk ik dat je nu meer tijd verliest door andere opties te zoeken dan wanneer je gewoon die queries aangepast zou hebben. :)

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


  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Als het echt een probleem is (en ik moet eerlijk zeggen dat ik niet begrijp waarom de laagste ID nu perse vooraan moet staan, dat maakt bij een koppeltabel toch niets uit...), kan je er aan denken om een aparte procedure te schrijven die de records die afwijken (ID1>ID2) omzet naar het juiste idee (ID1<ID2).

Dan kan je die achteraf, of op gezette tijden, uitvoeren zodat je data weer correct is.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14-02 11:11

Dido

heforshe

Het lijkt me dat je voor je een insert doet van ID1, ID2 gewoon kunt checken of ID2, ID1 al bestaat. Zo ja, niet inserten. Dan hoef je de insert-queries niet aan te passen, maar je moet wel checken voor iedere insert-query.

Op zich niet de mooieste oplossing als je op veel plaatsen die insert-query hebt staan, maar op veel plaatsen een insert query hebben is ook al niet echt mooi :P

Wat betekent mijn avatar?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

DND_Roche schreef op woensdag 12 juli 2006 @ 07:13:
(en ik moet eerlijk zeggen dat ik niet begrijp waarom de laagste ID nu perse vooraan moet staan, dat maakt bij een koppeltabel toch niets uit...)
Je begrijpt het idd niet. De laagste ID hoeft niet per se vooraan te staan, maar het is wél een goede manier om te controleren dat je geen duplicaten in je tabel hebt staan. Nu mag je een 1,2 inserten, maar ook een 2,1. Ze representeren dezelfde koppeling, maar het zijn verschillende keys en dus zal de database niet klagen als je ze insert.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 11 juli 2006 @ 21:29:
Nee hoor, want hoe zorg ik ervoor dat id_1 kleiner is dan id_2 zonder alle query's opnieuw te schrijven?
Waarom wil je dat met queries oplossen? Is het niet typisch iets dat je in je data access laag van je applicatie implementeert? Als je je applicatie goed hebt ontworpen is er maar 1 functie die een koppeling toevoegt, alleen die zou je dan maar aan hoeven te passen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14-02 11:11

Dido

heforshe

Gebruikers kunnen een lijst opgeven van e-mail adressen wie ze aan hun vrienden willen toevoegen.
Wanneer zowel gebruiker 1 als 2 dit doen worden ze dus 2x toegevoegd, dit is dus niet de bedoeling.
Misschien een heel domme vraag, maar waarom is dat niet de bedoeling?

Als persoon A persoon B in zijn vriendenlijst wil, maar persoon B wil persoon A er niet in, dan kan dat dus niet?

Sowieso moet je dus op een omslachtige manier uitlezen wie er in de lijst staat van persoon A, want je wilt niet alleen de lijst van persoon A, je wilt in feite ook weten in welke lijsten persoon A genoemd wordt.

Met andere woorden: is het niet veel logischer om iedereen zijn eigen lijst te laten beheren, onafhankelijk van andere gebruikers?
Nu kan ik mezelf bij iedereen in de lijst zetten door iedereen in mijn lijst te zetten, dat lijkt me niet handig. Misschien mis ik iets, dat kan ook nog :)

Wat betekent mijn avatar?


  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
.oisyn schreef op woensdag 12 juli 2006 @ 11:22:
[...]

Je begrijpt het idd niet. De laagste ID hoeft niet per se vooraan te staan, maar het is wél een goede manier om te controleren dat je geen duplicaten in je tabel hebt staan. Nu mag je een 1,2 inserten, maar ook een 2,1. Ze representeren dezelfde koppeling, maar het zijn verschillende keys en dus zal de database niet klagen als je ze insert.
Errr, je hebt gelijk, ik ben even het doel voorbij geschoten, het moet uniek blijven; ik bleef hangen op het punt wat Dido hier net gepost heeft.

Ik denk nog even verder.
Dido schreef op woensdag 12 juli 2006 @ 11:31:
Nu kan ik mezelf bij iedereen in de lijst zetten door iedereen in mijn lijst te zetten
Wel een mooie manier om aan veel vrienden te komen :D

[ Voor 17% gewijzigd door DND_Roche op 12-07-2006 11:37 ]

Pagina: 1