2014-04-17 53 views
1

我有一個約束:如何檢查檢查約束中的大小寫是否相等?

ALTER TABLE account 
ADD CONSTRAINT chk_account_type CHECK (Type IN ('saving', 'credit', 'HOME LOAN', 'PERSONAL LOAN', 'TERM DEPOSIT', 'CHECK', 'iSaver', 'SHARE')); 

當我嘗試插入

INSERT INTO Account VALUES ('012878', 123456, 22345678, 'Credit', -1534.52); 

它不工作。因爲Credit以大寫字符開頭。 如何設計一些我可以接受的保存,保存,保存。

+2

你爲什麼要接受不同情況下的相同價值?他們當然應該一致? –

回答

5

您可以通過更改的情況下,你檢查它這樣做:

ALTER TABLE account 
ADD CONSTRAINT chk_account_type CHECK (lower(Type) IN ('saving', 'credit', 
    'home loan', 'personal loan', 'term deposit', 'check', 'isaver', 'share')); 

但允許變化似乎很奇怪,因爲沒有強制執行通過檢查約束這些限制。將賬戶類型放在一個帶有主鍵的單獨表中,並使type列成爲一個外鍵是比較正常也更靈活的。然後,您可以通過添加新表來添加新的帳戶類型,而不必修改檢查約束,並且可以根據需要允許帳戶類型表中的不區分大小寫的查找,但始終始終顯示它們。

喜歡的東西:

create table account_types(account_type_id number, description varchar2(30), 
    constraint account_type_pk primary key (account_type_id)); 

insert into account_types (account_type_id, description) values (1, 'Saving'); 
insert into account_types (account_type_id, description) values (2, 'Credit'); 
insert into account_types (account_type_id, description) values (3, 'Home loan'); 
... 

create table account(account_number number, account_type_id number, 
    -- other columns... 
    constraint account_pk primary key (account_number), 
    constraint account_fk_account_type foreign key (account_type_id) 
    references account_types(account_type_id)); 

然後創建一個 '保存' 帳戶:

insert into account values (123, 1); 

1 rows inserted. 

如果你有一個無效的值,您可以:

insert into account values (124, 42); 

SQL Error: ORA-02291: integrity constraint (MYSCHEMA.ACCOUNT_FK_ACCOUNT_TYPE) violated - parent key not found 
02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"