私はこのようなことをしたいです:
create table app_users
(
app_user_id smallint(6) not null auto_increment primary key,
api_key char(36) not null default uuid()
);
しかし、これはエラーになります、mysqlのデフォルト値の関数を呼び出す方法はありますか?
ありがとう。
回答:
いいえ、できません。
ただし、次のようなトリガーを簡単に作成できます。
CREATE TRIGGER before_insert_app_users BEFORE INSERT ON app_users 各列 SET new.api_key = uuid();
SET new.api_key = COALESCE(new.api_key, uuid())
既存の値を保持します。
のとしてのMySQL v8.0.13フィールドのデフォルト値として式を使用することが可能です。
DEFAULT句で指定するデフォルト値は、リテラル定数または式にすることができます。1つの例外を除いて、式のデフォルト値を括弧で囲んで、リテラル定数のデフォルト値と区別します。
CREATE TABLE t1 (
uuid_field VARCHAR(32) DEFAULT (uuid()),
binary_uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID()))
);
残念ながら、MySQL 5ではデフォルトの定数が必要です。この問題については、以下のリンクで詳細に説明されています。しかし、唯一の答えはnullを許可し、テーブルトリガーを追加することです。
MySQLは最近、UUIDをDBパッケージの一部として受け入れただけであり、希望するほど機能が豊富ではありません。
getdate()
MySQL関数でもありません。回答のリンクは、唯一の例外を説明しています:«TIMESTAMP列のデフォルトとしてCURRENT_TIMESTAMPを指定できます»。
注MySQLのことUUID()
に戻りCHAR(36)
、テキストが(他の回答のように)明らかに非効率的であるとしてUUIDを保存します。代わりに、列はである必要がありBINARY(16)
、UUID_TO_BIN()
データを挿入するときやデータをBIN_TO_UUID()
読み取るときに使用できます。
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;
MySQLはこれがUUIDであることを実際には認識していないため、バイナリとして保存されている問題のトラブルシューティングが難しい場合があります。この記事では、スペースを占有したり、バイナリバージョンとテキストバージョンを別々に同期したりすることを心配することなく、必要に応じてUUIDをテキストに変換する生成列を作成する方法について説明します。https://mysqlserverteam.com/storing-uuid-values-in -mysql-tables /
上記の答えが古いバージョンのものかどうかはわかりませんが、unhex()関数を使用してこれを実行できることがどこかで見られました。私はそれを試してみましたが、うまくいきました。(マリアDBバージョン10.2)
できるよ
.... column_name binary(16) not null default unhex(replace(uuid(),'-',''))
そしてそれは動作します。UUIDを表示するには、hex(column_name)を実行します。