Ограничение SQL_Add и проверка строки с помощью LIKE - PullRequest
0 голосов
/ 22 марта 2019

Я использую Oracle SQL.Вот таблица аренды, а столбец CC_Type означает тип кредитной карты.После создания таблицы я хочу добавить ограничение, чтобы убедиться, что кредитная карта является либо «кредитной», либо «дебетовой»

 CREATE TABLE rental
( Rental_Num       VARCHAR2(5)  CONSTRAINT rental_PK PRIMARY KEY,
  Rent_Date        DATE DEFAULT SYSDATE,
  Credit_Card_Num  CHAR(16),
  CC_Type          CHAR(7),
  Member_ID        VARCHAR2(5)
);

Поэтому я пытаюсь написать:

ALTER TABLE RENTAL
  2  ADD CONSTRAINT CC_TYPE_CK
  3  CHECK(CC_TYPE LIKE 'Credit' OR CC_TYPE LIKE 'Debit');

Но выход SQL: невозможно проверить (SYSTEM.CC_TYPE_CK) - проверка ограничения нарушена

Я не понимаю, что нарушено, что?И как это исправить?Спасибо !!

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

просто удалите, после Member_ID VARCHAR2(5) в противном случае ваш запрос будет работать нормально

CREATE TABLE rental
    ( Rental_Num       VARCHAR2(5)  CONSTRAINT rental_PK PRIMARY KEY,
      Rent_Date        DATE DEFAULT SYSDATE,
      Credit_Card_Num  CHAR(16),
      CC_Type          CHAR(7),
      Member_ID        VARCHAR2(5)

    );

    ALTER TABLE RENTAL
        ADD CONSTRAINT CC_TYPE_CK
       CHECK(CC_TYPE LIKE 'Credit' OR CC_TYPE LIKE 'Debit');

демонстрационная ссылка

0 голосов
/ 22 марта 2019

Я согласен с Гордоном Линоффом, проверьте данные в cc_type.

select Distinct r.cc_type
from rental r;

Если вы все еще хотите создать ограничение, даже если у вас есть другие CC_TYPE (другими словами, без проверки существующихданные), тогда попробуйте это

ALTER TABLE RENTAL
    ADD CONSTRAINT CC_TYPE_CK
    CHECK (CC_TYPE IN ('Credit', 'Debit')) NOVALIDATE;
0 голосов
/ 22 марта 2019

У вас очевидно есть данные в таблице, которая нарушает ограничение.Ваш код в основном работает; здесь - это db <> скрипка (это исправляет лишнюю запятую перед закрывающей пареней в операторе создания таблицы).

Итак, ищите неверные данные:

select r.*
from rental r
where r.cc_type not in ('Credit', 'Debit');

Я бы также написал ограничение, используя in.,,это проще:

ALTER TABLE RENTAL
    ADD CONSTRAINT CC_TYPE_CK
    CHECK (CC_TYPE IN ('Credit', 'Debit'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...