10

このActors(forename, surname, stage_name);に少し似たテーブルがあります。

stage_name を更新して、デフォルト値を

forename." ".surname

となることによって

insert into actors(forename, surname) values ('Stack', 'Overflow');

レコードを作成します

'Stack'     'Overflow'    'Stack Overflow'

これは可能ですか?

ありがとう :)

4

3 に答える 3

14

DEFAULTMySQL は、列定義のオプションで計算された列または式をサポートしていません。

トリガーでこれを行うことができます (MySQL 5.0 以降が必要です)。

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors
FOR EACH ROW
BEGIN
  SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
END

同様のトリガーを作成することもできますBEFORE UPDATE

aを他の文字列とNULL連結すると. 必要に応じて、各列または連結された文字列で使用します。NULLNULLCOALESCE()

編集:次の例はstage_name、 の場合にのみ設定しますNULLstage_nameそれ以外の場合は、INSERTステートメントでを指定でき、保持されます。

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors
FOR EACH ROW
BEGIN
  IF (NEW.stage_name IS NULL) THEN
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname);
  END IF;
END
于 2008-12-11T19:03:56.743 に答える
2

私の最初の考えは、他のフィールドに 2 つの値がある場合、それらを 3 番目のフィールドに冗長に格納するための切実な必要性は何でしょうか? それは正規化と効率に直面して飛ぶ.

連結された値を単に保存したい場合は、値を疑似actorフィールドに連結し、テーブルの代わりにビュー/sproc から読み取りを実行するビュー (またはストアド プロシージャよりも優れた IMSNHO) を作成するだけです。

連結された値を絶対に格納する必要がある場合は、次の 2 つの方法でこれを処理できます。

1) 単純な SQL の代わりに、ストアド プロシージャを使用して挿入を行います。このようにして、値を受け取り、入力するフィールドの値を作成してから、actors フィールドの連結値を含む挿入ステートメントを作成できます。

2) だから私は炎をあまり描きません。最後の手段としてのみ使用してください。値が null のままの場合、トリガーを追加して値を構築することで、この動作をハッキングできます。一般的に、トリガーは良くありません。それらは、目に見えないコストとインタラクションをかなり単純なインタラクションに追加します。ただし、レコードが挿入または更新された後に、CREATE TRIGGER を使用してactors フィールドを更新することはできます。参考ページはこちら。

于 2008-12-11T19:13:12.557 に答える
2

10.1.4による。データ型のデフォルト値いいえ、できません。定数またはのみを使用できますCURRENT_TIMESTAMP

OTOH かなり最新の場合は、おそらくトリガーを使用して同じことを達成できます。

于 2008-12-11T19:01:57.120 に答える