it-swarm.com.de

Kann ich eine Funktion für einen Standardwert in MySql verwenden?

Ich möchte so etwas machen:


create table app_users
(
    app_user_id smallint(6) not null auto_increment primary key,
    api_key     char(36) not null default uuid()
);

Allerdings führt dies zu einem Fehler. Gibt es eine Möglichkeit, eine Funktion für einen Standardwert in mysql aufzurufen?

vielen Dank.

67
mmattax

Nein, das kannst du nicht.

Sie können jedoch leicht einen Trigger erstellen, um dies zu tun, z.

 CREATE TRIGGER before_insert_app_users 
 BEVOR EINFÜGEN AUF app_users 
 FÜR JEDE REIHE
 SET new.api_key = uuid (); 
109
Harrison Fisk

Wie schon gesagt, kannst du nicht.

Wenn Sie dieses Verhalten simulieren möchten, können Sie einen Trigger auf folgende Weise verwenden:

CREATE TRIGGER before_insert_app_users
BEFORE INSERT ON app_users
FOR EACH ROW
  IF new.uuid IS NULL
  THEN
    SET new.uuid = uuid();
  END IF;

Sie müssen noch vorhandene Zeilen wie folgt aktualisieren:

UPDATE app_users SET uuid = (SELECT uuid());
18
Pamput

Leider nein, MySQL 5 benötigt Konstanten für den Standard. Das Problem wurde in dem folgenden Link ausführlicher erörtert. Die einzige Antwort ist jedoch, Null zuzulassen und einen Tabellenauslöser hinzuzufügen.

MySQL hat erst kürzlich die UUID als Teil ihres DB-Pakets akzeptiert, und es ist nicht so reich an Funktionen, wie wir es gerne hätten.

http://www.phpbuilder.com/board/showthread.php?t=10349169

8
TravisO

Ich glaube Sie können nicht

der Standardwert muss eine Konstante sein. Es kann keine Funktion oder kein Ausdruck sein

6

Ab mysql v8.0.13 ist es möglich, einen Ausdruck als Standardwert für ein Feld zu verwenden:

Der in einer DEFAULT-Klausel angegebene Standardwert kann eine Literalkonstante oder ein Ausdruck sein. Mit einer Ausnahme schließen Sie die Standardwerte des Ausdrucks in Klammern ein, um sie von den Standardwerten der Konstanten zu unterscheiden.

CREATE TABLE t1 (
  uuid_field     VARCHAR(32) DEFAULT (uuid()),
  binary_uuid    BINARY(16)  DEFAULT (UUID_TO_BIN(UUID()))
);
5
Shadow

Beachten Sie, dass MySQLs UUID()CHAR(36) zurückgibt, und das Speichern von UUIDs als Text (wie in den anderen Antworten gezeigt) ist offensichtlich ineffizient. Stattdessen sollte die Spalte BINARY(16) sein, und Sie können UUID_TO_BIN() beim Einfügen von Daten und BIN_TO_UUID() beim Rücklesen verwenden.

CREATE TABLE app_users
(
    app_user_id SMALLINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    api_key     BINARY(16)
);

CREATE TRIGGER before_insert_app_users
BEFORE INSERT ON app_users
FOR EACH ROW
  IF new.api_key IS NULL
  THEN
    SET new.api_key = UUID_TO_BIN(UUID());
  END IF;

Da MySQL nicht wirklich weiß, dass dies eine UUID ist, kann es schwierig sein, Probleme zu beheben, die als binär gespeichert sind. In diesem Artikel wird erläutert, wie eine generierte Spalte erstellt wird, die die UUID nach Bedarf in Text konvertiert, ohne Speicherplatz zu belegen oder sich Sorgen zu machen, separate Binär- und Textversionen synchron zu halten: https://mysqlserverteam.com/storing-uuid-values -in-mysql-tables/

0
StephenS

In MariaDB ab Version 10.2.1 ist dies möglich. Siehe seine Dokumentation .

CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) ); INSERT INTO test () VALUES (); SELECT * FROM test;

0
ibotty

Ich bin nicht sicher, ob die obigen Antworten für eine ältere Version gelten, aber ich habe irgendwo gesehen, dass Sie dies mit der Funktion unhex () tun können. Ich habe es ausprobiert und es funktioniert. (maria db version 10.2)

Du kannst tun 

.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))   

und es funktioniert. Um die uuid zu sehen, tun Sie einfach hex (spaltenname). 

0
ravindu1024