【问题标题】:SQL_Add constraint and check the string using LIKESQL_Add 约束并使用 LIKE 检查字符串
【发布时间】:2019-08-13 09:34:29
【问题描述】:

我正在使用 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) - 违反检查约束

我不明白它违反了什么?以及如何解决? 谢谢!!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的表中显然有违反约束的数据。您的代码基本上可以工作; here 是一个 dbfiddle(这修复了 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'));
    

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        【解决方案3】:

        我同意 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-14
          • 2013-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-26
          • 2017-11-25
          • 1970-01-01
          相关资源
          最近更新 更多