[SQL] UNIQUE check op twee kolommen?

Pagina: 1
Acties:

Onderwerpen


  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 30-08 12:32
Hey,

klein, kort vraagje: ik heb data in een tabel staan (waarde1, een datum, en waarde2), die uniek zijn over twee velden (waarde1 en datum). Nu wil ik gegevens updaten/toevoegen dmv een REPLACE query.

Ik vroeg me af of er een manier is om op query niveau te checken of de combi waarde1 -> datum al in de tabel staat? Nu kan ik namelijk alleen checken als ik één van de twee kolommen uniek maak, en dat gaat uiteraard niet (er kunnen best meerdere dezelfde waarde1 in de tabel staan met een andere datum).

Natuurlijk kan ik dit helemaal gaan checken buiten de query met (bijv.) PHP, maar ergens voel ik dat het makkelijker kan. Ik kan uiteraard handmatig een extra kolom toevoegen die waarde1 en datum aan elkaar plakt, en daar op checken, maar dat is gewoon niet netjes.

Alvast bedankt ;)

  • 418O2
  • Registratie: November 2001
  • Laatst online: 09:45
unique(concat(field1, field2))

of iets dergelijks?

  • glmona
  • Registratie: Maart 2005
  • Laatst online: 15-08 06:22
Wanneer je een unique index hebt, mislukt de update toch als de gegevens niet bestaan?

Dan krijg je een error die je kan afvangen..

[ Voor 16% gewijzigd door glmona op 26-08-2010 16:34 ]


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 13:23

orf

Je weet dat een unique key ook gewoon over meerdere kolommen kan? Dan faalt vanzelf een insert of update query.

  • Svennetjee
  • Registratie: December 2007
  • Laatst online: 30-08 12:32
orf schreef op donderdag 26 augustus 2010 @ 16:33:
Je weet dat een unique key ook gewoon over meerdere kolommen kan? Dan faalt vanzelf een insert of update query.
Nee, wist ik niet. Net even uitgeprobeerd en het werkt hemels. Bedankt! ;)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11-09 17:45

Robtimus

me Robtimus no like you

orf schreef op donderdag 26 augustus 2010 @ 16:33:
Je weet dat een unique key ook gewoon over meerdere kolommen kan? Dan faalt vanzelf een insert of update query.
+1

De enige beperking (in ieder geval in MS SQL Server) is dat die kolommen niet nullable mogen zijn.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 12:38
IceManX schreef op donderdag 26 augustus 2010 @ 16:38:
[...]

+1

De enige beperking (in ieder geval in MS SQL Server) is dat die kolommen niet nullable mogen zijn.
Of dat een beperking is weet ik nog niet, de database zal gewoon een = vergelijking doen, en een <kolom> = NULL is ook altijd false. Dit komt natuurlijk omdat NULL "iets waarvan niks bekend is" is, en hoe moet de database "iets" met "iets waarvan niks bekend is" gaan vergelijken? Juist, dat kan niet, want een van de twee (of beide) operanden is niks over bekend. Als omweg kun je nog een combinatie met een functionele index proberen, waarbij een COALESCE van die kolom (met een vaste waarde) uniek moet zijn en niet de kolom zelf.

Edit:
Uit onderstaande post van Tiemez blijkt dat er bij MS SQL weer wat anders aan de hand is met NULLs in een unique index. Ik verwachte dat het gedrag van MS SQL hetzelfde zijn als bij PostgreSQL, die dus bovenstaand gedrag vertoont.

[ Voor 13% gewijzigd door RobertMe op 26-08-2010 18:16 ]


  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
IceManX schreef op donderdag 26 augustus 2010 @ 16:38:
[...]

+1

De enige beperking (in ieder geval in MS SQL Server) is dat die kolommen niet nullable mogen zijn.
vanaf 2008 mag dat wel, http://www.proace.com/201...lumns-in-sql-server-2008/

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11-09 17:45

Robtimus

me Robtimus no like you

Dat is eigenlijk best vet, dat dat tegenwoordig wel kan. Wij zitten helaas nog op 2005.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ik vraag me af hoe ze dat dan gedaan hebben. Het is nu eenmaal zo dat null = null ≡ null. Wanneer je een unique constraint legt op een nullable kolom gaat dat ook zoals verwacht. Elke waarde kan maar 1x voorkomen, behalve null omdat null = null geen true oplevert.

Het probleem komt pas bij het verwachtingspatroon dat je hebt bij een samengestelde kolom. Volgens de regels is een vergelijking tussen (waarde,null) en (waarde,null) geen true. Wanneer er in de ene kolom dus null staat kan de waarde in de andere kolom gewoon meerdere keren voorkomen.

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


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Janoz schreef op donderdag 26 augustus 2010 @ 21:56:
Het probleem komt pas bij het verwachtingspatroon dat je hebt bij een samengestelde kolom. Volgens de regels is een vergelijking tussen (waarde,null) en (waarde,null) geen true. Wanneer er in de ene kolom dus null staat kan de waarde in de andere kolom gewoon meerdere keren voorkomen.
Dat kan dus ook gewoon, zo is het geimplementeerd.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 12:38
Grijze Vos schreef op vrijdag 27 augustus 2010 @ 08:51:
[...]

Dat kan dus ook gewoon, zo is het geimplementeerd.
Als ik het linkje van Tiemez erbij pak, staat daar toch echt:
In earlier versions of SQL Server when you created a unique constraint on a nullable column, NULL would count as a value and you would only be able to use NULL once.
Dan ga ik er dus vanuit dat NULL = NULL true is in MS SQL en er dus een soort van conversie plaatsvind waarbij ze NULL in een CHAR/VARCHAR/TEXT kolom omzetten naar een lege string of iets dergelijks (en bij alle types zo'n conversie doen) en dat ze op basis daarvan zeggen dat NULL = NULL true is.
Pagina: 1