Добавить регулярное выражение проверки ограничений в базу данных Oracle - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть приложение, в котором код, такой как YYY / YY / YY или YYY.YY.YY, вставляется раньше, чем это было только с "."

Поэтому предыдущий разработчик добавил ограничение в соответствующую таблицу, котороеЯ захожу в среду TEST, но хочу добавить новую

ALTER TABLE DEPLOYMENT_ADM.DEPLOYMENT 
  ADD CONSTRAINT deployment_chk_billing 
  CHECK (   BILLING_CODE LIKE '[0-9]{3}/[0-9]{2}/[0-9]{2}' 
         OR BILLING_CODE LIKE '[0-9]{3}\\.[0-9]{2}\\.[0-9]{2}');

Но когда я пытаюсь это сделать, у меня есть

ORA-02293: cannot validate (DEPLOYMENT_ADM.DEPLOYMENT_CHK_BILLING) - check constraint violated

Так что я не вижу, где ошибка

1 Ответ

1 голос
/ 05 ноября 2019

Вы хотите regexp_like():

ALTER TABLE DEPLOYMENT_ADM.DEPLOYMENT ADD CONSTRAINT deployment_chk_billing
 CHECK (regexp_like(BILLING_CODE, '^[0-9]{3}/[0-9]{2}/[0-9]{2}|[0-9]{3}\\.[0-9]{2}\\.[0-9]{2}$');

РЕДАКТИРОВАТЬ:

Я хотел бы отметить, что LIKE было неправильно с подстановочными знаками. Я думаю, что вам нужно регулярное выражение:

ALTER TABLE DEPLOYMENT_ADM.DEPLOYMENT 
  ADD CONSTRAINT deployment_chk_billing 
  CHECK ( REGEXP_LIKE(BILLING_CODE, '([0-9]{3}/[0-9]{2}/[0-9]{2})|([0-9]{3}[.][0-9]{2}[.][0-9]{2})' ) );

Или, если вам все равно, если . и / имеют одно и то же значение:

ALTER TABLE DEPLOYMENT_ADM.DEPLOYMENT 
  ADD CONSTRAINT deployment_chk_billing 
  CHECK ( REGEXP_LIKE(BILLING_CODE, '[0-9]{3}[./][0-9]{2}[./][0-9]{2})) );
...