我正在使用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)-检查约束是否违反
我不明白它违反了什么?以及如何解决? 谢谢!
答案 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');
答案 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;