2016-09-12 3 views
0

Hallo Ich habe eine Entwicklung auf MYSQL gebaut und erwägen, auf Grund der Lizenzkosten für kommerzielle Software auf PostGres zu verschieben.UUID SHORT() für PostGres

In meinem MYSQL habe ich mehrere Tabellen, wo ich auf die Verwendung der UUID_SHORT() - Funktion als Primärschlüssel in diesen Tabellen angewiesen bin. Siehe Link: Mysql UUID_SHORT Info

Hat PostGres eine ähnliche Funktion wie die UUID_SHORT-Funktion? Ich suche eine uniqiue ID und bin nicht an einer Sequenz interessiert. Auch etwas, das auf der Systemzeit wie UUID_SHORT basiert, wäre großartig. Auch unten ist die Klassenfunktion, die ich in PHP verwende, wenn ich eine eindeutige ID für den Primärschlüssel in MYSQL einfügen möchte.

Schätzen Sie alle Kommentare, da dies der Hauptgrund für PostGres wäre.

function getUniqueId(){ 
     //return unique id 

     $temp_id = strval(uniqid()); 
     $temp = $this->conn->prepare('CREATE TEMPORARY TABLE tempId (temp_id VARCHAR(30) PRIMARY KEY, id BIGINT UNSIGNED)'); 
     $temp->execute(); 
     $temp = $this->conn->prepare('INSERT INTO tempId(temp_id, id) VALUES(:temp_id, UUID_SHORT())'); 
     $temp->bindParam(':temp_id', $temp_id, PDO::PARAM_STR); 
     $temp->execute(); 
     $temp = $this->conn->prepare('SELECT id FROM tempId WHERE temp_id = :temp_id '); 
     $temp->bindParam(':temp_id', $temp_id, PDO::PARAM_STR); 
     $temp->execute(); 
     $tempResult= $temp->fetchAll(PDO::FETCH_ASSOC); 
     $temp = $this->conn->prepare('DROP TEMPORARY TABLE tempId'); 
     $temp->execute(); 
     $temp_id = $tempResult[0]['id'];  
     return $temp_id; 
    } 
+1

ich von vielen Gründen gehört zu wechseln, aber * nie * ein: p – Drew

+0

Lizenzkosten? MySQL hat keine. – Bohemian

+0

Postgres ist eine umfassendere Datenbank und hat einen nativen UUID-Spaltentyp. Verwenden Sie nur normale. Es ist wahrscheinlich nicht die Mühe wert, diese mutierte, nicht standardmäßige "kurze" Version zu verwenden. – tadman

Antwort

3

PostgreSQL hat eine extension called "uuid-ossp" mit 4-Algorithmen, die jeweils einer der Amts UUID-Algorithmen implementieren, die 4. von denen einer in 122 Bits zufällig ist (die verbleibenden 6 Bits als eine Version 4 UUID identifizieren). Alle diese geben einen 16-Byte-UUID-Wert zurück.

(Beachten Sie, dass ein 64-Bit-Wert per Definition keine UUID ist. Die MySQL-Referenz, die Sie angeben, erklärt dies im Grunde bereits: Nur garantiert, wenn Sie ein Regelwerk nicht brechen sollte es eine "LUID" nennen, denn es ist definitiv nicht universal einzigartig.Dies ist die Art von zwicken (nehmen Sie einen definierten Standard und geben Sie es Ihre eigene Wendung), die wie das Böse von Microsoft schmeckt. Aber ich schweife ab.)

In PostgreSQL:

CREATE EXTENSION "uuid-ossp"; 

Mit der Erweiterung installiert Sie dieverwenden könnenDatentyp:

CREATE TABLE my_table (
    id uuid PRIMARY KEY DEFAULT uuid_generate_v4(), 
    ... 
END; 

Dann können Sie eine Zeile in der Tabelle einzufügen und den Primärschlüssel in einem Rutsch abrufen:

INSERT INTO my_table (...) VALUES (...) 
RETURNING id; 

Die obige Aussage wird wieder die uuid Wert als 16-Byte binary Wert, nicht sicher, wie Sie das in PHP verwalten würden.

Sie können auch erzeugen nur einen uuid Wert ohne Einfügen einer Zeile:

SELECT uuid_generate_v4(); 
+0

Brilliant genau was ich wollte –