我想让NAME
表中的USERS
列中的数据不区分大小写,我该怎么做?我想像这样使用alter table:
ALTER TABLE table_name ALTER COLUMN column_name (something to make it case insensitive);
答案 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