2012-02-28 10 views
2

電気通信システム用の小さなデータベースを作成しています。SQL(oracle)チェック制約の難易度 - 実装方法がわからない

テーブル(コール)の1つは、電話番号の市外局番があらかじめ定義されたリストに含まれていない場合、その番号をテーブルに追加しないでください。

私がこれを行うことについて考えているのは、コールテーブル内にチェック制約を入れて、このリストの一部ではない番号を受け入れないことです。しかし、このリストはかなり長く、より良い実装方法があれば分かりません。ここで

はリストである:これで

ALTER TABLE calls ADD (CONSTRAINT area_ck 
CHECK area_code ("01" or "02" or "075" or "077" or "078" or "079" or "0800" or 
     "0845" or "0870" or (BETWEEN ("08442" AND "08449")) or 
     (BETWEEN ("08712" AND "08719")) or 
     "090" or "091" or "098") 
    ) ; 

私の二つの主な問題点は以下のとおりです:次のようにこれを行うには、私は考えることができ

01 or 02: local/national number. Ex.: 01612 338866. 
075, 077, 078, 079: mobile phone number. Ex.: 07747 556647. 
0800: free number. Ex.: 08002 223344. 
0845, 0870: special service. Ex.: 08451 423456. 
08442 to 08449: 5p special service. Ex.: 08444 404404. 
08712 to 08719: 10p special service. Ex.: 08713 457893. 
090, 091, 098: premium rate special service. Ex.: 09119 229595. 

唯一の方法はある

  1. これは正しく実装されていないためエラーです
  2. 私がmodiそれが動作するまで少しそれを、それはまだ私の仕事を解決しようとすることについて長い道のりだろうか?
+0

さらに高度なチェックをしたい場合は、Ofcomに[ダウンロード可能なファイル]があります(http://www.ofcom.org.uk/static/)。 numbering/codelist.zip)、またはすべてを[zipファイル](http://www.ofcom.org.uk/static/numbering/codelist.zip)に入れてください。潜在的には、ファイルを外部表として使用し、それらのファイル全体に有効なコードのビューを作成できます。私はそれがあなたの問題の過剰なものだと確信していますが、しばらく関心があるかもしれません。なぜあなたが '03 'の数字を除外したのか不思議です。 –

答えて

5

より一般的なアプローチが有効な値

INSERT INTO area_code(area_code) VALUES('01'); 
INSERT INTO area_code(area_code) VALUES('02'); 
INSERT INTO area_code(area_code) VALUES('075'); 
... 

又は

BEGIN 
    FOR i IN 1000 .. 2999 
    LOOP 
    INSERT INTO area_code(area_code) 
     VALUES(to_char(i, '00000')); 
    END LOOP; 
END; 
のセットと Area_Codeテーブルを埋める

CREATE TABLE area_code (
    area_code VARCHAR2(5) PRIMARY KEY 
); 

有効なエリアコードテーブルを定義することであろう

そして、外部キーconstを定義するCHECK制約より施行するために、より効率的になるだろうし、有効なエリアコードを一覧表示することが容易になりますArea_Codeテーブル

CREATE TABLE call (
    call_id NUMBER PRIMARY KEY, 
    area_code VARCHAR2(5) REFERENCES area_code(area_code), 
    <<other columns>> 
); 

にごCallテーブルからraint。

+0

ありがとう、ジャスティン。私はこのように実装するつもりです。あなたの素早い返信のおかげでもう一度お返事します – JD87

+0

実際には、この方法を練習に入れている間に、エリアコードは最大5文字になる可能性がありますので、例: 01または02:地方/国内番号。例:01612 338866. 数字は実際に01000〜02999 になる可能性があります。これらのエントリはすべてテーブルに置く必要がありますか、何らかの部分文字列操作を使用する必要があります? もう一度おねがいします! – JD87

+0

@ JD87 - 最も簡単なアプローチは、PL/SQLを少し書いて、 'AREA_CODE'テーブルに移入することです。私は答えを「01000」と「02999」の間の文字列に入れる例で更新しました。 –

0

area_code='01' OR area_code='02' ...のいずれかを入力するか、area_code in ('01','02', ...)を使用できます。キーワードの前には、area_codeを追加する必要があります。

しかし、チェック制約の代わりにエリアコードをテーブルに格納し、エリアコードを外部キーとして使用することをお勧めします。こうすることで、市外局番のリストを簡単に修正することができます。

0

最初の問題は、=と一緒に使うことです。それは好きですか:

area_code in ('01', '02', '03') or area_code between ('1000' and '1500') or .... 
+0

あなたの返事をありがとう、私はあなたの方法で行っているように見えるが、私は一緒にすべてを連結して問題を抱えているように見える、あなたが素早く見て、私が間違っている、素晴らしいこと、感謝 ALTER TABLEは のADD CONSTRAINTをphone_calls 0845」 '075'、 '077'、 '078'、 '079'、 '0800'、( '01'、 '02' は チェックrec_area_codeをarea_ck '、' 0870 '、' 090 '、' 091 '、' 098 ')または(rec_area_code BETWEEN(' 08442 'AND' 08449 ') )); 大カッコでさまざまな組み合わせを試しましたが、私は右か左かっこが足りないと言っています。 – JD87