t0bbi Skrevet 4. februar 2008 Skrevet 4. februar 2008 (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 25. februar 2008 av t0bbi
kaffenils Skrevet 4. februar 2008 Skrevet 4. februar 2008 Opprett en unique constraint eller unique index på kolonnen.
t0bbi Skrevet 4. februar 2008 Forfatter Skrevet 4. februar 2008 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?
blackbrrd Skrevet 4. februar 2008 Skrevet 4. februar 2008 Løsningen nevnt ovenfor er det eneste måten å være 100% sikker på at du kun får unike verdier i tabellen.
t0bbi Skrevet 4. februar 2008 Forfatter Skrevet 4. februar 2008 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?
Frank2004 Skrevet 4. februar 2008 Skrevet 4. februar 2008 (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 4. februar 2008 av Frank2004
roac Skrevet 5. februar 2008 Skrevet 5. februar 2008 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.
t0bbi Skrevet 5. februar 2008 Forfatter Skrevet 5. februar 2008 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..
kaffenils Skrevet 5. februar 2008 Skrevet 5. februar 2008 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.
t0bbi Skrevet 5. februar 2008 Forfatter Skrevet 5. februar 2008 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?
kaffenils Skrevet 5. februar 2008 Skrevet 5. februar 2008 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.
roac Skrevet 6. februar 2008 Skrevet 6. februar 2008 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 ...
t0bbi Skrevet 6. februar 2008 Forfatter Skrevet 6. februar 2008 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++ ?
kaffenils Skrevet 6. februar 2008 Skrevet 6. februar 2008 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?
roac Skrevet 6. februar 2008 Skrevet 6. februar 2008 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).
blackbrrd Skrevet 6. februar 2008 Skrevet 6. februar 2008 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).
t0bbi Skrevet 6. februar 2008 Forfatter Skrevet 6. februar 2008 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?
kaffenils Skrevet 6. februar 2008 Skrevet 6. februar 2008 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.
Frank2004 Skrevet 6. februar 2008 Skrevet 6. februar 2008 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.
t0bbi Skrevet 6. februar 2008 Forfatter Skrevet 6. februar 2008 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.
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå