5

私は参照namedescriptionていて、テーブルuser_idの列です。meta2回、そしておそらくそれ以上(誰が知っていますか?) 将来的に. これらの列は、メタ リソースの ETag を計算するために使用されます。

将来 ETag の計算に寄与する列を 1 つ追加すると、コードを N 回変更する必要があり、これは悪いことです。

DRY にしてこれらの列名を別の場所に保存する方法はありますか? INSERTこれらの列名は、 on meta を実行するときにも使用したいためです。

IF only = true THEN
    -- Calculate ETag on meta fields only
    UPDATE meta
    SET etag = etag(CONCAT(name, description, user_id))
    WHERE id = meta_id;
ELSE
    -- Calculate Etag on meta fields and meta customers
    BEGIN
        DECLARE c_etags VARCHAR(32);

        -- Compute c_etags

        UPDATE meta
        SET etag = etag(CONCAT(etag(name, description, user_id), c_etags))
        WHERE id = meta_id;
    END;
END IF;

免責事項: このコードはテストされていません。単純なステートメントを除いて、私は MySQL にかなり慣れていません。

EDIT : MySQL 関数ですetagMD5多分これは1つのオプションです:

CREATE PROCEDURE set_meta_etag(IN meta_id INT, IN related TEXT)
    NOT DETERMINISTIC
BEGIN
    UPDATE meta
    SET etag = etag(CONCAT(name, description, user_id,
        IF(related IS NOT NULL, related, '')))
    WHERE id = meta_id;
END //

-- First call
CALL set_meta_etag(meta_id, NULL);

-- Second call
CALL set_meta_etag(meta_id, c_etags);

INSERTしかし、それはステートメントには機能しません。

4

2 に答える 2

0

これが 1 つのテーブルに限定されていることがわかっている場合は、トリガーを追加できます。トリガーを使用AFTERすると、ストアド プロシージャが と の両方INSERTで機能するようになりますUPDATEInsert と Update の両方については、MySQL Fire Trigger を参照してください。

于 2012-09-05T17:45:41.793 に答える
0

明らかなこと (foreach 列が必要な場合は、それを使用して etag を作成する) は、SQL では簡単に機能しません。これは、歴史的に、SQL は変数に格納された列名を考慮していないためです。

お気に入りの非 SQL プログラミング言語 (Java、PHP など) でプログラムを作成して、プロシージャを作成し、定義することができます。

作業を行ってわずかなパフォーマンスの低下を許容する場合は、いわゆる「動的 sql」を使用してこれを行うこともできます。見る

MySQL ストアド プロシージャで動的 SQL を使用する方法

ストアド プロシージャの使用方法PREPAREとステートメントについては、 を参照してください。EXECUTE

ところで、私はコラムのコンテンツにさまざまな種類のメタデータを格納するシステムの構築に成功しています。たとえば、列の内容で文字列 '[etag]' を検索するコードを記述できます。列のコメントは

information_schema.COLUMNS.COLUMN_COMMENT

プログラムの起動時に非常に簡単に処理できます。

于 2012-08-19T17:50:06.610 に答える