SQL_Add约束并使用LIKE检查字符串

时间:2019-03-22 11:46:28

标签: sql oracle

我正在使用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 :(得分:0)

您显然在表中有违反约束的数据。您的代码基本上可以正常工作; here是一个db <>小提琴(这可以解决create table语句中结尾括号之前的多余逗号)。

因此,寻找不良数据:

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

答案 1 :(得分:0)

只需删除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');

demo link

答案 2 :(得分:0)

我同意Gordon Linoff,请检查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;