2011-12-07 15 views
6

私はいくつかのカラムがあるa,b,cを持っていて、それぞれのカラムに別のカラム、たとえばがあり、それぞれa,b,cに依存しています。mysqlでテーブル制約を作成する

x,y,zは、a,b,cに値がある場合は値が1a,b,c has nullの場合はnullを含みます。例えば

言うでき、aに格納されている 値は2でありxはそれに依存カラムです。 したがって、xの値は1となります。

aに格納された値がnullの場合、xの値はnullとなります。

テーブルの作成時にこの制約を宣言できる方法があります。

トリガー以外をお勧めします。

+0

皆さん、お返事ありがとうございますが、トリガー以外のことをお勧めします。私は、テーブル作成にいくつかの制約を加えることができるので読んでいます。 –

+0

いいえ、できません。他のほとんどのDBMS(Postgre、Oracle、SQL Serverなど)とは異なり、MySQLはチェック制約をサポートしていません。 –

答えて

7

create view myview as 
    select a, b, c, 
    if (isnull(a), null, 1) as x, 
    if (isnull(b), null, 1) as y, 
    if (isnull(c), null, 1) as z 
    from mytable; 

このテーブルではなく、直接このビューをベースにしてください。

+0

お返事ありがとうございましたが、そのテーブルには挿入が行われる場所がたくさんありますが、それは巨大なアプリケーションであり、2つの異なるプラットフォームを持っています... –

+0

あなたはこのアプローチを詳しく説明してくださいこの。 –

+0

こんにちは。どのビットが不明ですか?ビューに関するMySQLのドキュメントは、[here](http://dev.mysql.com/doc/refman/5.6/en/views.html)です。 – mikej

1

MySQLはそれ自体はCONSTRAINTSを処理しませんが、あなたはBEFORE INSERTBEFORE UPDATEイベントにTRIGGERを使用して同様の動作を実装することができます。ただし、他のテーブルレベルの制約(NOT NULL)を使用すると、this other question on SOのように動作する必要があります。

非常に特殊なケースでは、トリガーを使用して "不適切な"値のデータが挿入されないようにトリガーを使用するのではなく、トリガーを使用してトリガーを使用して値を計算したいと思うようです。あなたの質問は、この点を明確にはっきりさせるものではないので、あなたが本当に望むものに依存します。

1

はい、これにはtriggersを使用できます。 Trigger syntax章から

:あなたが記述シナリオは、データが正規化されていないことを意味するが

BEFOREトリガーが失敗した場合は、対応する行の操作は

行われません。 xyzの目的は、あなたも、この例を実行するためにビューを使用して検討することもでき、あなたのテーブルの上に列としてxyzを持つのではなく、その後、いくつかのクエリを簡単にすることである場合

1

制約に加えて、あなたはすべてのx、y、zの列で保存し、ビューを使用してないことによって、同様の結果を得ることができます:

CREATE VIEW myView AS 
SELECT 
    a, b, c, 
    (a = a) AS x, 
    (b = b) AS y, 
    (c = c) AS z 
FROM myTable 
4

あなたが探している制約がチェック制約です。

CREATE TABLE test 
(
    a varchar(10), 
    b varchar(10), 
    c varchar(10), 
    x integer, 
    y integer, 
    z integer, 
    CONSTRAINT chk_X_Nulls CHECK ((a is null and x is null) or (a is not null and x = 1)), 
    CONSTRAINT chk_Y_Nulls CHECK ((b is null and y is null) or (b is not null and y = 1)), 
    CONSTRAINT chk_Z_Nulls CHECK ((c is null and z is null) or (c is not null and z = 1)) 
); 

残念ながらこれは、MySQLのに実装されていません。この機能のために2004年にさかのぼるopen bug reportがありますので、すぐにそれを見ることを期待しないでください。

他にも、トリガーやビューを使用して目的の結果を得ることができると回答した人もいますが、これはMySQLの正解です。

また、部分的にいくつかの簡単なトリックを使用してデータを制約することができます

  • x, y, zenum('1')へのデータ型を設定します。これにより、null'1'以外の値が挿入されることはありませんが、値が正しいことは保証されません。
  • a, b, cが可能な値の限定された範囲を持っている場合は、他のテーブルに外部キー制約を作成し、スケジュールにx, y, zを更新するeventを作成することができますa, b, c
  • のすべての可能な値を持つこれらのテーブルを移入することができます(たとえば、一度時間または1日に1回)。それらが間違っていると、x, y, zの値を修正することができます。あなたは、トリガーがあなたの仕事のために不適切である理由を説明してくださいさらにアドバイスが必要な場合は

あなたは、PostgreSQL here

とアクションでチェック制約を見ることができます。

関連する問題