设置列表不区分大小写的oracle 11g

时间:2015-11-28 10:30:46

标签: oracle oracle11g

我想让NAME表中的USERS列中的数据不区分大小写,我该怎么做?我想像这样使用alter table:

ALTER TABLE table_name ALTER COLUMN column_name (something to make it case insensitive);

1 个答案:

答案 0 :(得分:5)

表中的列不能成为case insensitive,没有这样的选项。

一种选择是创建virtual column,如果您只想将字符串显示为不区分大小写,并搜索此类不敏感的字符串,但实际数据仍然以区分大小写的形式存储在表中。
这是一个例子:

CREATE table TEST(
  name VARCHAR2(100),
  surname varchar2(100)
);

insert into  test values('John', 'Toms' );
insert into  test values('Tom', 'Johns' );

ALTER TABLE test add name_uppercase as (Upper( name ));

select * from test;

NAME       SURNAME    NAME_UPPERCASE     
----------------------------------------
John       Toms       JOHN       
Tom        Johns      TOM  

CREATE INDEX Test_name_upper_ix on test( name_uppercase );

Select * FROM test WHERE name_uppercase = 'TOM';

NAME       SURNAME    NAME_UPPERCASE     
----------------------------------------      
Tom        Johns      TOM  

请注意,在此示例中,为此类virtual列创建了索引。
此列可以像查询中的任何其他ordiary clumn一样使用,但无法更新。

但是,如果您希望将数据不区分大小写直接存储在表中,则可以使用触发器在插入/更新期间转换数据,这样:

set define off
CREATE OR REPLACE TRIGGER surname_to_upper
BEFORE insert or update On test FOR EACH ROW
BEGIN
  :new.surname := Upper( :new.surname );
END;
/

您还可以向表中添加约束以仅允许在某些列中插入大写数据,如下所示:

alter table test 
add constraint name_must_be_uppercase check( name = upper(name));

在这种情况下,当有人试图插入包含小写字母的name列时,会收到错误消息:

insert into test values( 'Tom', 'Johns' );
SQL Error: ORA-02290: naruszono więzy CHECK (TEST.NAME_MUST_BE_UPPERCASE)
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check