Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:11 Der er 38 kommentarer og
1 løsning

Generere random nummer i MySQL

Hej Eksperter.

vil høre om det ikke er muligt at generere et unikt random nummer i mysql ?
Avatar billede barklund Nybegynder
28. februar 2007 - 19:15 #1
Unikt i forhold til? Et nummer, der aldrig har eksisteret før? Det er ret svært ;)
Avatar billede straszek Praktikant
28. februar 2007 - 19:17 #2
du kan i mysql sætte option til "auto_increment", så får hver post et unikt nummer
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:18 #3
yeah i know.

men problemet er at jeg skal kryds referere med en anden tabel, og da jeg ikke er sikker på at ID er det samme i begge tabeller, har jeg brug for at kunne genere et nummer som er unikt i databasen, dvs. der kun findes det nummer 1 gang i databasen.
Avatar billede barklund Nybegynder
28. februar 2007 - 19:20 #4
Ellers har xkcd et godt bud:

http://xkcd.com/c221.html

Og derudover bør du bruge en sequence til det du ønsker. Så kan du begge steder fra referere til samme sequence hver gang du har brug for et nyt id.

--
Morten Barklund
Avatar billede brinck10 Nybegynder
28. februar 2007 - 19:21 #5
Kan du ikke hashe et eller andet nummer som heletiden opdateres, også sætte det ind i hver tabel? Så kan du kryds referere dem!
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:23 #6
altså kunne også bare lave en rand(), men så skal jeg tjekke hele databasen igennem, om nummeret findes. :S. Og syntes det ville være nemmere hvis mysql havde en indbygget funktion til at kunne indsætte et unikt random nummer.
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:25 #7
barklund -> ehhh tror det er java det der. :)
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:28 #8
tænkte lidt på, at hente alle numre ud fra databasen, og smide dem i et array, og tjekke op på der, og hvis nummeret findes, så genere et nyt...

nu er det så bare længe siden jeg har leget med arrays. :S
Avatar billede simplus Nybegynder
28. februar 2007 - 19:31 #9
det kan du sagtens ved at skrive

$array[] = $row[number];

hvor number er det felt i din database - husk en tilhørene query :-)

Dog forstår jeg ikke hvorfor du ikke bare tjekker det op på MySQL istedet for først at putte det i et array? Det er jo spild af tid ;-)
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:32 #10
how ?
Avatar billede barklund Nybegynder
28. februar 2007 - 19:34 #11
blackscorpion: eller en lang række andre sprog :)

Og nej, du skal bruge en anden tabel, som kun har én række, og så bruger du den som en sekvens. Hver gang du skal bruge et nyt unikt id i én af de to tabeller, så laver du en:

UPDATE minsekvens SET value = value + 1;
SELECT value;

Så har du et garanteret unikt id på tværs af begge tabeller.

Det er absolut det mest optimale.

--
Morten Barklund
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:37 #12
okey nice.. havde jeg ikke lige tænkt på..

den sql der

UPDATE minsekvens SET value = value + 1;
SELECT value;

hvis jeg laver en $sql = "UPDATE minsekvens SET value = value + 1;
SELECT value;";

$result = mysql_query($sql);

vil den så opdatere nummeret, og samtidigt hente det ud, som ved en normal select ?
Avatar billede simplus Nybegynder
28. februar 2007 - 19:37 #13
Du finder det nummer der skal tjekkes, smider det i en variabel. Lad os kalde den $numb

så laver du en simpel query

$query = mysql_query("SELECT feltnavn FROM database WHERE number = '$numb' LIMIT 1")or die(Fejl: mysql_error());

også laver du en

$resultat = mysql_num_rows($query)

if ($resultat > 0) {
    //fandt noget
}else{
    //fandt intet
}
Avatar billede simplus Nybegynder
28. februar 2007 - 19:39 #14
Tja, den metode er langt hurtigere...
Avatar billede barklund Nybegynder
28. februar 2007 - 19:41 #15
Du er nødt til at køre det i to queries som:

function getNewId() {
mysql_query("UPDATE minsekvens SET value = value + 1");
return mysql_result(mysql_query("SELECT value FROM minsekvens"), 0);
}

Så kan du bare kalde den funktion, når du har brug for et id.

--
Morten Barklund
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:42 #16
sejt...

det er jeg nødt til at prøve. :D
Avatar billede arne_v Ekspert
28. februar 2007 - 19:44 #17
Med hensyn til spoergsmaalet saa vil man normalt lave AUTO_INCREMENT i den
ene tabel, indsaette i den og saa bruge den genererede vaerdi ved indsaettelse i
den anden tabel.
Avatar billede arne_v Ekspert
28. februar 2007 - 19:45 #18
Med hensyn til:

UPDATE SET +1
SELECT

saa skal man taenke sig lidt om med hensyn til flere bruger problematikken !
Avatar billede barklund Nybegynder
28. februar 2007 - 19:46 #19
Ja, jeg ville nok også smide det i en sp eller lave det via noget trigger-noget. Jeg er bare lidt mere til PG for tiden, så jeg kan ikke lige huske mest optimale metode i MySQL :)
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:46 #20
sygt det går stærkt...

kan holde F5 nede og se den opdatere fra 0-100 på omkring 1sek eller noget. :S

morten, smid lige et svar, du fortjener dem sku. :D

og simplus, og alle jer andre, tak for din tid. :)
Avatar billede simplus Nybegynder
28. februar 2007 - 19:50 #21
anytime :-)
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 19:55 #22
proggede lidt videre på den. :D

<?php

require("config/config.inc.php");
require("config/functions.inc.php");

echo "uhhh... lets generate some id's! :oD<br>\n<br>\n<br>\n";

//echo rand(10000, 150000) . "_" . rand(10, 9999) . "_" . rand(15001, 1500000);

function getNewId() {
connect();
mysql_query("UPDATE value SET id = id + 1");
return mysql_result(mysql_query("SELECT id FROM value"), 0);
}

$num = getNewId();

$new_value = ($num*rand(10000, 150000))/rand(1, 150);

echo $new_value;

?>

giver nogle ret syret numre. :D
Avatar billede arne_v Ekspert
28. februar 2007 - 20:07 #23
brug af SP/trigger loeser ikke samtidigheds problemet
Avatar billede blackscorpion Nybegynder
28. februar 2007 - 20:09 #24
hvad mener du ?
Avatar billede coderdk Praktikant
28. februar 2007 - 21:02 #25
UPDATE sekvens SET value = LAST_INSERT_ID(value + 1);

efterfulgt af

SELECT LAST_INSERT_ID();
Avatar billede coderdk Praktikant
28. februar 2007 - 21:02 #26
Fordelen ved denne er at den kun tilgår tabellen én gang...
Avatar billede coderdk Praktikant
28. februar 2007 - 21:04 #27
function getNewId() {
  connect();
  mysql_query( "UPDATE value SET id = LAST_INSERT_ID( id + 1 )" );
  return mysql_result( mysql_query( "SELECT LAST_INSERT_ID()" ), 0 );
}
Avatar billede arne_v Ekspert
01. marts 2007 - 02:58 #28
jeg mener at der et et potentielt problem med flere samtidige brugere
Avatar billede arne_v Ekspert
01. marts 2007 - 03:07 #29
coderdk's kode skulle være flerbruger sikker - omend det er kode som
skriger på en lang kommentar lige ovenover
Avatar billede barklund Nybegynder
01. marts 2007 - 10:58 #30
Men hvis blackscorpion alligevel har tænkt sig bagefter at gange tallet med et tilfældigt tal, så er unikheden væk. Hvorfor skal tallet være et stort tal, for at være "tilfældigt"? Hvis det skal være unikt, så er det kriteriet. Skal det være tilfældigt, så er det altså et andet kriterium.
Avatar billede arne_v Ekspert
01. marts 2007 - 15:13 #31
det er rigtigt
Avatar billede blackscorpion Nybegynder
01. marts 2007 - 16:22 #32
LAST_INSERT_ID <-- hvad præcist gør den der ?
Avatar billede blackscorpion Nybegynder
01. marts 2007 - 16:32 #33
If you insert a record into a table that contains an AUTO_INCREMENT column, you can obtain the value stored into that column by calling the mysql_insert_id() function.

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

----------------

Så burde det da være muligt at... ehh

altså:

jeg smide ret produkt i min tabel, vi kalder det en computer.

computer|dell|10000|www.dell.dk?some_wierd_stuff_here

når den er indsat, burde den så ikke trække det korrekte ID ud fra tabellen, så jeg kan bruge den i den tabel med alle specs'ne til computeren ?

håber i forstår. :S
Avatar billede blackscorpion Nybegynder
01. marts 2007 - 16:32 #34
overse lige stavefejlne. :)
Avatar billede blackscorpion Nybegynder
01. marts 2007 - 16:34 #35
det jeg sådan set tænkte på var at eleminere hele processen med 2 kald til mysql for at generere et id, når den kan trække id direkte ud, så jeg kan bruge det senere...

altså eliminere et mysql kald, hvilket burde øge hastigheden med et par milisekunder. :D
Avatar billede barklund Nybegynder
01. marts 2007 - 17:48 #36
Gæt selv hvordan mysql_insert_id fungerer ;)
Avatar billede blackscorpion Nybegynder
03. marts 2007 - 18:12 #37
forresten smid lige et svar coderdk ;)
Avatar billede coderdk Praktikant
03. marts 2007 - 18:15 #38
Sorry, glemte at følge med her :P
Avatar billede blackscorpion Nybegynder
03. marts 2007 - 21:40 #39
det er okey, gjorde jeg også. :P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester