JD8*_*D87 2 sql oracle constraints
我正在为电信系统创建一个小型数据库.
其中一个表(呼叫)要求如果电话号码的区号不包含在预定义列表中,则不应将该号码添加到表中.
我想到这样做的方法是在调用表中放置一个检查约束,以便不接受不属于这个提到的列表的数字.但是,这个列表很长,我不太确定是否会有更好的实现方法.
这是清单:
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.
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是:
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")
) ;
Run Code Online (Sandbox Code Playgroud)
我的两个主要问题是:
更常见的方法是定义有效区域代码表
CREATE TABLE area_code (
area_code VARCHAR2(5) PRIMARY KEY
);
Run Code Online (Sandbox Code Playgroud)
Area_Code
使用一组有效值填充表格
INSERT INTO area_code( area_code ) VALUES( '01' );
INSERT INTO area_code( area_code ) VALUES( '02' );
INSERT INTO area_code( area_code ) VALUES( '075' );
...
Run Code Online (Sandbox Code Playgroud)
要么
BEGIN
FOR i IN 1000 .. 2999
LOOP
INSERT INTO area_code( area_code )
VALUES( to_char( i, '00000' ) );
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
然后从Call
表中定义外键约束到Area_Code
表
CREATE TABLE call (
call_id NUMBER PRIMARY KEY,
area_code VARCHAR2(5) REFERENCES area_code( area_code ),
<<other columns>>
);
Run Code Online (Sandbox Code Playgroud)
这比执行CHECK
约束更有效,列出有效区号更容易.
归档时间: |
|
查看次数: |
571 次 |
最近记录: |