SQL (оракул) Проверить сложность ограничения - не уверен, как реализовать - PullRequest
2 голосов
/ 28 февраля 2012

Я создаю небольшую базу данных для телекоммуникационной системы.

В одной из таблиц (звонков) требуется, чтобы: если код зоны телефонного номера не содержался в заранее определенном списке, номер не добавлялся в таблицу.

То, как я думал об этом, - это установить ограничение проверки в таблице вызовов, чтобы не принимать числа, которые не являются частью этого упомянутого списка. Однако этот список довольно длинный, и я не слишком уверен, что будет лучший способ реализации.

Вот список:

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.

Единственный способ, которым я мог придумать, заключается в следующем:

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")
      ) ;

У меня есть две основные проблемы:

  1. выдает ошибку, поскольку реализовано неправильно
  2. Если бы я немного изменил его до тех пор, пока он не заработал, было бы еще долго пытаться решить мою задачу?

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

Более распространенным подходом будет определение таблицы действительных кодов зоны

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

Заполните таблицу 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' );
...

или

BEGIN
  FOR i IN 1000 .. 2999
  LOOP
    INSERT INTO area_code( area_code )
      VALUES( to_char( i, '00000' ) );
  END LOOP;
END;

А затем определите ограничение внешнего ключа из таблицы Call в таблицу Area_Code

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

Это будет более эффективно для применения, чем ограничение CHECK, и будет легче перечислить действительные коды города.

0 голосов
/ 28 февраля 2012

Первая проблема связана с использованием = и между ними. Сделай это как:

area_code in ('01', '02', '03') or area_code between ('1000' and '1500') or ....
0 голосов
/ 28 февраля 2012

Вы можете написать area_code='01' OR area_code='02' ... или использовать area_code in ('01','02', ...).Вам также необходимо добавить area_code перед ключевым словом.

Но я бы посоветовал вам хранить коды зоны в таблице вместо контрольного ограничения и использовать коды зоны в качестве внешних ключей.Таким образом, список кодов городов можно легко изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...