2017-11-01 10 views
1

私はMYSQL 5.7を使用していますが、8.0で導入されたメソッドにはアクセスできません。生成された列で関数を使用するには?

そこで私はこのような何かしたい:私は指定されたSQLを実行したときに

CREATE FUNCTION uuid_to_bin(uuid CHAR(36)) 
    RETURNS BINARY(16) DETERMINISTIC 
    RETURN concat(
     substr(unhex(replace(uuid, '-', '')), 7, 2), 
     substr(unhex(replace(uuid, '-', '')), 5, 2), 
     substr(unhex(replace(uuid, '-', '')), 1, 4), 
     substr(unhex(replace(uuid, '-', '')), 9, 8)); 

CREATE TABLE `example` (
    `id`  BINARY(16) GENERATED ALWAYS AS (uuid_to_bin(document->>'$.id')) STORED NOT NULL, 
    `document` JSON                 NOT NULL, 
    PRIMARY KEY (`id`) 
) 
    ENGINE = InnoDB 
    DEFAULT CHARSET = utf8 
    COLLATE = utf8_bin; 

は、しかし、それはエラーがスローされます。 [2017-11-01 14:12:41] [HY000][3102] Expression of generated column 'id' contains a disallowed function.

はしても機能が決定論あると思いました。どうやってやるの ?将来的には私は8.0に私のMySQLサーバをアップグレードすることができます場合、私は私のコラム

また

多分これが理由であることのためのSQLを変更したくないので、

は、私は私の機能uuid_to_binと呼ばれますか? COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary'

答えて

0

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html - 生成された列式は、次の規則に従わなければなりません。式に許可されていない構文が含まれていると、エラーが発生します。

リテラル、決定的組み込み関数、および演算子が許可されている.. サブクエリ、パラメータ、変数、格納された機能、およびユーザ定義関数はを許可されていません。

+0

だから私はその部分(関数の本体)をすべてのテーブルで繰り返す必要があります。私はその種のバイナリuuidを生成したい – Vardius

関連する問題