SQL(oracle)检查约束难度 - 不确定如何实现

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)

我的两个主要问题是:

  1. 由于实现不正确,因此会出错
  2. 如果我稍微修改它直到它确实有效,那么尝试解决我的任务还有很长的路要走吗?

Jus*_*ave 5

更常见的方法是定义有效区域代码表

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约束更有效,列出有效区号更容易.