Gå til innhold

hindre like lik data i kolonne [Løst]


Anbefalte innlegg

Skrevet (endret)

Holder på å lage en database der jeg gjerne vil legge inn varchar i 1 kolonne av en av tabellene.

Spørsmålet mitt er om det er mulig å sjekke om strengen som blir forsøkt lagt inn med en INSERT spørring, ligger i kolonnen fra før.

Hvis ordet test ligger inn vil jeg gjerne sjekke både for test med store og små bokstaver. Noen som har noen tips til hvordan jeg kan løse dette problemet?

Endret av t0bbi
Videoannonse
Annonse
Skrevet
Opprett en unique constraint eller unique index på kolonnen.

 

Takk for svaret, vet du om dette kan gjøres i mysql gui tool'en eller om dette kun kan gjøres via kommandolinja?

 

Er dette eneste måten å gjøre det på eller er det andre løsninger?

Skrevet
Løsningen nevnt ovenfor er det eneste måten å være 100% sikker på at du kun får unike verdier i tabellen.

 

Er det mulig å la tekststrengene: Test, test og TEST tolkes som det samme selv om det brukes store og små bokstaver?

Skrevet (endret)
Løsningen nevnt ovenfor er det eneste måten å være 100% sikker på at du kun får unike verdier i tabellen.

 

Er det mulig å la tekststrengene: Test, test og TEST tolkes som det samme selv om det brukes store og små bokstaver?

Vanligste måten å løse dette på tror jeg er en functional index, dersom rdbms'en din støtter det. F.eks i postgres noe slikt som

create unique index unique_name on people (lower(name));

 

Alternativet blir å lage en egen kolonne med unique constraint, hvor du lagrer en lower-case versjon av strengen; enten vha. en insert/update trigger eller kode i applikasjonen.

Endret av Frank2004
Skrevet
Vanligste måten å løse dette på tror jeg er en functional index, dersom rdbms'en din støtter det. F.eks i postgres noe slikt som
create unique index unique_name on people (lower(name));

 

Alternativet blir å lage en egen kolonne med unique constraint, hvor du lagrer en lower-case versjon av strengen; enten vha. en insert/update trigger eller kode i applikasjonen.

Jeg ville heller ha gjort det noe mer "etter boka", og spesifisert collation for kolonnen. Dersom collation er case sensitiv, så vil indeksen/constraintet være det også, og visa versa.

Skrevet
Vanligste måten å løse dette på tror jeg er en functional index, dersom rdbms'en din støtter det. F.eks i postgres noe slikt som
create unique index unique_name on people (lower(name));

 

Alternativet blir å lage en egen kolonne med unique constraint, hvor du lagrer en lower-case versjon av strengen; enten vha. en insert/update trigger eller kode i applikasjonen.

Jeg ville heller ha gjort det noe mer "etter boka", og spesifisert collation for kolonnen. Dersom collation er case sensitiv, så vil indeksen/constraintet være det også, og visa versa.

 

Har du kode eksempler på dette? Jeg bruker Mysql..

Skrevet

Nå kan jeg lite om MySQL, men et raskt søk i dokumentasjonen:

 

create table tab99(col99 varchar(10) character set latin1 collate latin1_general_cs)

 

cs i latin1_general_cs står for case sensitive. Det betyr at 'a'<>'A'. Vil du ha case insensitive, dvs. at 'a'='A' så bruker du latin1_general_ci. En index vil basere seg åp kolonnens collation, så hvis du har brukt et *cs collation så vil indexen ta hensyn til dette.

Skrevet

Ser ut til at MySQL i utgangspunktet ikke er casesensitivt, så da har jeg et problem mindre. Nå har jeg tenkt å lage en prosedyre som sjekker om en tekst jeg skriver inn allerede ligger i en kolonne. Det jeg lurer på er hvordan jeg lager prosedyren, har tenkt å ha en SELECT setning som henter ut all data i raden, men jeg lurer på hvordan jeg kan sammenligne det med det ene stringen jeg vil settte inn med INSERT spørring. Noen forslag?

Skrevet

Forstår jeg deg rett når jeg sier at du vil sjekke om verdien eksisterer før du kjører INSERT?

Isåfall kan du enkelt å greit bare eksekvere en SELECT statement og sjekke om det returneres en rad eller ikke.

 

SELECT MyUniqueCol from MyTable where MyUniqueCol='minverdi'

 

 

Uansett må du ha en unique index eller unique constraint som på databasenivå sørger for at verdiene i kolonnen er unike.

Nå vet ikke jeg om MySQL håndhever en unique constraint ved å opprette en unique index (slik SQL Server gjør), så for sikkerhets skyld så oppretter du en unique index. Denne vil også sørge for at SELECT statementet ditt utføres ved å bruke en index seek istedet for en table/index scan.

Skrevet
Ser ut til at MySQL i utgangspunktet ikke er casesensitivt, så da har jeg et problem mindre.

Jeg tillater meg å komme med litt kritikk: DÅRLIG DESIGN! Når du vet hvordan du lager noe som garantert vil fungere, og du lager noe som fungerer med standardinstallasjon men ikke nødvendigvis ellers, så minner det om manglende erfaring og/eller seriøsitet. Det er ALT for mange slike løsninger allerde, men for all del, de sikrer meg jobb ...

Skrevet

Har tenkt å bruke STRCMP funksjonen for å sjekke data i den ene kolonnen mot data som skal legges inn med INSERT.

Lurer nå på om det finnes en måte å søke gjennom en kolonne, å sammenligne string som settes inn ved INSERT, med en og en string i kolonnen.

Finnes det f eks noe som tilsvarer en for løkke i java med i++ ?

Skrevet
Har tenkt å bruke STRCMP funksjonen for å sjekke data i den ene kolonnen mot data som skal legges inn med INSERT.

Lurer nå på om det finnes en måte å søke gjennom en kolonne, å sammenligne string som settes inn ved INSERT, med en og en string i kolonnen.

Finnes det f eks noe som tilsvarer en for løkke i java med i++ ?

 

Hvorfor i all verden skal du bruke STRCMP? Det er da mye enklere med en vanlig WHERE som jeg allerede har forklart deg. Gidder du ikke å lese det vi skriver?

Skrevet
Har tenkt å bruke STRCMP funksjonen for å sjekke data i den ene kolonnen mot data som skal legges inn med INSERT.

Lurer nå på om det finnes en måte å søke gjennom en kolonne, å sammenligne string som settes inn ved INSERT, med en og en string i kolonnen.

Finnes det f eks noe som tilsvarer en for løkke i java med i++ ?

 

Hvorfor i all verden skal du bruke STRCMP? Det er da mye enklere med en vanlig WHERE som jeg allerede har forklart deg. Gidder du ikke å lese det vi skriver?

Istemmes kaffenils. Dette er en typisk utvikler som enten ikke har lært settorientert tankegang, eller klarer å tenke slik. Å loope gjennom ting i Java eller hva som helst annet på klientsiden er måten man ABSOLUTT IKKE skal gjøre det på.

 

Mitt klare råd t0bbi: Lær deg SQL. Det er det du SKAL bruke mot databaser. (Og ja, jeg er også motstander Hibernate og tilsvarende søl).

Skrevet

Hibernate lager jo sql direkte ut fra hva du skriver, men du slipper å lage metodene for å gjøre om result-settet til java-objekter.

 

F.eks HQL-en

 

SELECT a FROM torder a

INNER JOIN FETCH a.torderstatus b

 

Blir gjort om til f.eks:

SELECT a.*, b.* FROM torder a

INNER JOIN a.torderstatus b ON a.orderid = b.id_orderid

 

Ser ikke helt hva som er problemet her, utenom med sql-en da, som man manuelt må gjøre om til java objekter (tidkrevende å kode).

Skrevet

Etter litt frem og tilbake brukte jeg kaffenils sin måte for å løse dette. nå har jeg et nytt spørsmål:)

Holder på å opprette en prosedyre som skal legge til data i en av tabellene, en av radene er boolean, men uansett hva jeg prøver å legge inn blir får jeg bare 0'ere... noen som vet hva jeg gjør feil?

Skrevet
Jeg ville heller ha gjort det noe mer "etter boka", og spesifisert collation for kolonnen. Dersom collation er case sensitiv, så vil indeksen/constraintet være det også, og visa versa.

Absolutt penere når man jobber på en db som støtter dette, ja.

Skrevet
Nå skal du få et lite tips av meg. Når du spør "hva gjør jeg feil" så er det veldig greit å vise os hva du faktisk gjør, dvs. vis oss kildekode/sql.

 

Her er noe av det jeg har gjort:

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `prosedyrenavn`(in navn varchar(30),partner boolean, status ENUM('aktiv','ikke aktiv'))

 

Det er altså bolean delen jeg har problemer med, usikker på om dette er rett.Ellers fungerer alt som det skal.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...