[Mysql] Kolomnamen achterhalen adv key

Pagina: 1
Acties:

  • robbert
  • Registratie: April 2002
  • Laatst online: 19:22
Hoi,

als ik in een tabel met een unique index een dubbele waarde stop (welke in strijd is met de index) krijg ik mooi deze error: #1062 - Duplicate entry '%s' for key %d.
Alleen wil adv die key achterhalen bij welk invoerveld mijn gebruiker een dubbele waarde in heeft gevuld, kortom ik wil een achterhalen over welke kolom(men) van mijn tabel deze index staat.
Ik gebruik php als server side scripting taal en kan in de php manual evenals in de mysql manual en google niks nuttigs vinden.
Handmatig met php gaan checken of unique indexes niet worden overschreden lijkt me niet echt een mooie oplossing.

Ik gebruik: php 4.4.0-4 en mysql 4.1.14

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Ik ben bang dat je de error melding van MySQL zult moeten gaan parsen. Een andere oplossing zou ik zo niet weten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Krijg je niet uit de database terug welke voorwaarde werd geschonden?

Oracle vertelt mij het volgende:
code:
1
2
3
4
5
6
7
8
9
SQL> insert into groep(id,naam) values (999,'Henk');

1 row created.

SQL> insert into groep(id,naam) values (998,'Henk');
insert into groep(id,naam) values (998,'Henk')
*
ERROR at line 1:
ORA-00001: unique constraint (UN_GROEP) violated

Met UN_GROEP weet ik precies welke voorwaarde er bedoeld wordt.

Siditamentis astuentis pactum.


  • lier
  • Registratie: Januari 2004
  • Laatst online: 23:06

lier

MikroTik nerd

Is het mogelijk (binnen MySql) om iets te doen met de naam van de unique index ? Misschien kan je je naamgeving zodanig aanpassen dat zowel de tabelnaam als de kolomna(a)m(en) hierin voorkomen.

Eerst het probleem, dan de oplossing


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Tja, Oracle is geen MySQL. mysql heeft geen constraints (behalve dat je een unique op een kolom kunt zetten), laat staan dat je je constraints een naam kunt geven ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 22-04 22:07

Bosmonster

*zucht*

Snap je probleem niet zo. Je wilt niet vooraf checken, maar je krijgt bij de query toch een error terug (mysql_error()). Zo weet je toch bij het invoeren al of de gebruiker iets duplicaats invoert? En ik neem aan dat je dan ook wel weet wat je aan het invoeren was (en wat er dus fout ging).

Nu is het net of je alle fout-signalen compleet aan het negeren bent en dan later toch een keer wilt kijken waar die fout nu ook al weer vandaan kwam.

[ Voor 39% gewijzigd door Bosmonster op 28-11-2005 16:06 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Het kan natuurlijk ook zijn dat er twee kolomen in 1 tabel een unique constraint hebben he. Die moet je ook uit elkaar kunnen houden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • robbert
  • Registratie: April 2002
  • Laatst online: 19:22
Het probleem is juist dat je zo weinig uit de errormelding kan halen, ik kan hem zo parsen en de waarde welke niet ingevoegd mag worden en de key eruit halen. Maar daar kan ik zo weinig mee.
Indexes kan je wel namen geven ( ADD UNIQUE `indexmetnaam` ( `naam` ) ) maar die krijg je helaas niet te zien in de foutmelding.
Bosmonster schreef op maandag 28 november 2005 @ 16:05:
Snap je probleem niet zo. Je wilt niet vooraf checken, maar je krijgt bij de query toch een error terug (mysql_error()). Zo weet je toch bij het invoeren al of de gebruiker iets duplicaats invoert? En ik neem aan dat je dan ook wel weet wat je aan het invoeren was (en wat er dus fout ging).

Nu is het net of je alle fout-signalen compleet aan het negeren bent en dan later toch een keer wilt kijken waar die fout nu ook al weer vandaan kwam.
Het punt is net dat de database in princiepe verantwoordelijk is om te controleren of er geen indexes worden overschreden (en niet het php scriptje).
Als er indexes worden overschreden krijg ik ook mooi een error terug (en kan ik de gebruiker daarover op de hoogte stellen), maar ik kan niet achterhalen over welke kollomen die index staat. Ik krijg alleen een of ander getal (die key) waar ik zo ontzettend weinig mee kan.
Janoz schreef op maandag 28 november 2005 @ 16:11:
Het kan natuurlijk ook zijn dat er twee kolomen in 1 tabel een unique constraint hebben he. Die moet je ook uit elkaar kunnen houden.
Begrijp ik, vandaar ook kolomnamen. ;)

[ Voor 78% gewijzigd door robbert op 28-11-2005 16:18 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:57

Janoz

Moderator Devschuur®

!litemod

Die key geeft precies aan om welke kolom het gaat. Dat is gewoon het volgnummer afaik. eerste kolom is 1 (of 0), tweede is 2 (of 1) enz enz.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • robbert
  • Registratie: April 2002
  • Laatst online: 19:22
Janoz schreef op maandag 28 november 2005 @ 16:22:
Die key geeft precies aan om welke kolom het gaat. Dat is gewoon het volgnummer afaik. eerste kolom is 1 (of 0), tweede is 2 (of 1) enz enz.
Nope, dat dacht ik ook al. ;) heb een tabel met 6 kolommen en op de 4e en 5e staat een index, maar krijg terug: Duplicate entry '1-1' for key 2.

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Is de key niet de betreffende kolom uit de index waarvoor de duplicate optreedt ?

  • robbert
  • Registratie: April 2002
  • Laatst online: 19:22
TheRookie schreef op maandag 28 november 2005 @ 16:29:
Is de key niet de betreffende kolom uit de index waarvoor de duplicate optreedt ?
zo'n idee had ik ook al, maar als ik SHOW INDEX FROM tabelnaam doe kan ik die nummers nergens terug vinden.
Wel heb ik het idee, als ik ga tellen dat het (redelijk) overeen komt in welke volgorde Key_name (de index naam) voorkomt (bv index met naam test komt als 2e voor en geeft ook key 2 terug).
Pagina: 1