2012-05-01 8 views
-1

私はこのように、アップロードされたファイルの内容を保存するためのMySQLのテーブルを持っている:MySQLはINSERTの同じテーブルの他の列のCONCATとして列を設定しますか?

CREATE TABLE files (
    file_id bigint not null primary key auto_increment, 
    file_name text, 
    file_path text, 
    file_extension varchar(15), 
    file_link text); 

ディスク上のファイルの実際の名前は、私はレコードを挿入すると、テーブルによって生成されたfile_idに設定されている - ただしので、私はあらゆる種類の詳細を記録することができますが、データベースは実際にこの時点でファイルが呼び出されたことを実際には知りません。

カラムを設定する直後に別のUPDATE文を実行するのは簡単ですが、ここでもう少し優雅なやり方があるのか​​どうか疑問に思っていますか?直後に別のUPDATEステートメントを実行することなく、CONCAT(file_path, file_id, file_extension):私がやりたい何

file_linkの値は自動的にこれにINSERTに設定されています。

私はこれをどうやって行うことができるか知っていますか?それが悪い考えであれば、なぜ説明できますか?

P.S私は違いがある場合、これらのステートメントを実行するためにPHPを使用しています。

+0

なぜ冗長データを挿入するのですか? – ethrbunny

+0

@etherbunnyは主にSELECTステートメントの複雑さを減らすために、私は複数の場所で使用するつもりですが、file_linkとfile_extensionの列を削除する可能性が高くなりますインサート。しかし、はい、あなたは正しいです、それは冗長です – jammypeach

+1

私は反対をする傾向があるだろう:file_linkを削除し、file_pathを維持する。そうすれば、サーバー上のファイルを移動してパスを更新しなければならなくなります。 file_linkの一部としてパスがある場合、それを変更するのはちょっと複雑です。 – ethrbunny

答えて

2

次のトリガーでこれを行うことができます:私が言っているが、私は個人的にSELECT声明でこれを作成する代わりに、データベースがこのようなことを行う持って行くだろう...

DELIMITER $$ 

CREATE TRIGGER makelink BEFORE INSERT ON files 
    FOR EACH ROW 
    BEGIN 
     SET NEW.file_link = CONCAT(NEW.file_path, NEW.file_id, NEW.file_extension); 
    END; 
$$ 

DELIMITER ; 

挿入 - 静的なデータを格納する方が少し効率的ですが、データベーススキーマの透過性が低下します。

+0

あなたと@ethrbunnyによって提案されたように、しかし、トリガ+1: – jammypeach

+1

あなたはおそらくまた、更新プログラムのトリガが欲しいでしょう... – eggyal

1

通常、派生データは保存しません。あなたはいくつかのスペアサイクルがあるときにデータベースの正規化についていくつか読んでください。

関連する問題