Chcę zrobić coś takiego:
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
Jednak powoduje to błąd, czy istnieje sposób na wywołanie funkcji dla wartości domyślnej w mysql?
dzięki.
SET new.api_key = COALESCE(new.api_key, uuid())
aby zachować istniejące wartości.Od mysql v8.0.13 możliwe jest użycie wyrażenia jako wartości domyślnej dla pola:
CREATE TABLE t1 ( uuid_field VARCHAR(32) DEFAULT (uuid()), binary_uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())) );
źródło
varchar(32)
powinien byćvarchar(36)
Jak już wspomniano, nie możesz.
Jeśli chcesz zasymulować takie zachowanie, możesz użyć wyzwalacza w następujący sposób:
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;
Nadal musisz zaktualizować wcześniej istniejące wiersze, na przykład:
UPDATE app_users SET uuid = (SELECT uuid());
źródło
Niestety nie, MySQL 5 domyślnie wymaga stałych. O wiele bardziej szczegółowo zagadnienie zostało omówione w linku poniżej. Ale jedyną odpowiedzią jest zezwolenie na null i dodanie wyzwalacza tabeli.
MySQL dopiero niedawno zaakceptował UUID jako część swojego pakietu DB i nie jest tak bogaty w funkcje, jak byśmy chcieli.
http://www.phpbuilder.com/board/showthread.php?t=10349169
źródło
Myślę, że nie możesz :
źródło
getdate()
nie jest nawet funkcją MySQL. Link w odpowiedzi wyjaśnia jedyny wyjątek: «możesz określić CURRENT_TIMESTAMP jako wartość domyślną dla kolumny TIMESTAMP» .Zwróć uwagę, że
UUID()
zwroty MySQLCHAR(36)
i przechowywanie identyfikatorów UUID w postaci tekstu (jak pokazano w innych odpowiedziach) jest oczywiście nieefektywne. Zamiast tego kolumna powinna byćBINARY(16)
i możesz jej użyćUUID_TO_BIN()
podczas wstawiania danych iBIN_TO_UUID()
podczas ich ponownego odczytu.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;
Zwróć uwagę, że ponieważ MySQL tak naprawdę nie wie, że jest to identyfikator UUID, może być trudno rozwiązać problemy z nim przechowywane jako binarne. W tym artykule wyjaśniono, jak utworzyć wygenerowaną kolumnę, która w razie potrzeby przekonwertuje identyfikator UUID na tekst bez zajmowania miejsca lub martwienia się o synchronizację oddzielnych wersji binarnych i tekstowych: https://mysqlserverteam.com/storing-uuid-values-in -mysql-tabele /
źródło
Nie jestem pewien, czy powyższe odpowiedzi dotyczą starszej wersji, ale widziałem gdzieś, że możesz to zrobić za pomocą funkcji unhex (). Spróbowałem i działa. (maria db wersja 10.2)
Możesz to zrobić
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
i to działa. Aby zobaczyć identyfikator UUID, po prostu wykonaj hex (nazwa_kolumny).
źródło
W MariaDB począwszy od wersji 10.2.1 możesz. Zobacz jego dokumentację .
CREATE TABLE test ( uuid BINARY(16) PRIMARY KEY DEFAULT unhex(replace(uuid(),'-','')) ); INSERT INTO test () VALUES (); SELECT * FROM test;
źródło