2016-07-15 4 views
1

私は次のように二つのテーブルと同様のデータベースを持っている:彼が望んでいるよう子にチェック制約を追加して、MySQLの親の値をチェックすることはできますか?

+----------------------+   +------------------------+ 
|Persons    |   |phones     | 
+----------------------+   +------------------------+ 
|id  int   +-----+  |id   int   | 
|name  varchar(100) |  +---->+person_id int   | 
|allowed tinyint(1) |   |number  int   | 
+----------------------+   +------------------------+ 

一人は、多くの携帯電話を持つことができますが、彼は(> 0許可)、それを許可する必要があります。

だから、私は

CREATE TABLE `phones` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `persons_id` int(11) DEFAULT NULL, 
    `phonenumber` int(5) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `phones_ibfk_1` (`persons_id`), 
    CONSTRAINT `phones_ibfk_1` FOREIGN KEY (`persons_id`) REFERENCES `persons` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8` 

を使用して、両方のテーブルを作成した。しかし、これは私が欲しいものをチェックしません。可能であれば私が知りたいことは、ALTER TABLE phones ADD CONSTRAINT chk_person CHECK (persons.allowed > 0)のようなクエリを作ります。これは可能ですか?別の方法がありますか?

+0

無意識の努力。 'allowed'が' 0'ならば、サーバサイドのコードでは単純に挿入を行いません。リレーショナルデータベースは**関係**を扱い、**権限**は扱いません。また、人が 'phones'に' n'レコードを持ち、 'allowed'を' 0'にすると、サーバサイドのコードは単に 'phones'の問い合わせを無視して何も表示しません。すべてのことを行うためにRDBMSを使用する必要はなく、誰かができることとできないことではなく、データを処理します。 – Mjh

+0

@Mjh DBはデータの整合性を考慮します。 –

+0

@ Golinmarqおそらく、その制限を処理するためのトリガーが必要です。 –

答えて

1

チェック制約がソリューションを動作しませんが、あなたが何かを見つけた場合、あなたがwron

DELIMITER || 
CREATE TRIGGER trigger_check before insert ON phones FOR EACH ROW 
begin 
DECLARE is_allowed boolean; 
select allowed into @is_allowed from Persons where id = new.person_id; 
if @is_allowed <1 then 
    insert into phones values ('','','',''); #make erreur doesn't metter 
    end if ; 
end || 
DELIMITER ; 
にerreurの原因となります同じテーブルへの挿入を行う値を確認して 挿入前にトリガーを作成することです

これは、今のところチェック制約が新しいバージョンで動作することを望んでいます。

+0

ありがとうございます!これは解決策になる可能性があります – Golinmarq

+0

はい – Cherif

関連する問題