oracle PK问题
我列出我全部的做法:
table a 有id1, str1, str2, str3
开始的pk是id1, str1, str2
希望改成id1, str1, str3
--问题
小弟先有如下问题:
一个表原来的PK是 id1+str1+str2 列
先修改成id1+str1+str3列
而这三列现在当前数据库的数据有重复的情况, 小弟现在用sql:
ALTER table a add
constraint PK_a primary key (id1,str1,str3)
USING INDEX
TABLESPACE ts
ENABLE NOVALIDATE;
但是还是提示会出错,哪位大虾给帮忙一下~~
急啊!在线等!!!!
我的步骤:
Alter table a drop primary key drop index;
ALTER table a add
constraint PK_a primary key (id1, str1, str3)
USING INDEX
TABLESPACE ts
ENABLE NOVALIDATE;
提示的错误:
SQL>
ALTER table evanpk add
2 constraint PK_evanpk primary key
(id1, str1, str2)
USING INDEX TABLESPACE WBXOBJ_LARGE_IDX
3 4 ENABLE NOVALIDATE;
constraint PK_evanpk primary
key (id1, str1, str2)
*
ERROR at line 2:
ORA-02437: cannot validate (TEST.PK_EVANPK) - primary key violated
回答----原因分析
SQL> create table t1(c1 number,c2 varchar2(10));
表已创建。
SQL> insert into t1 values(1,1);
已创建 1 行。
SQL> insert into t1 values(1,2);
已创建 1 行。
SQL> alter table t1 add constraint pk_t1 primary key(c1) enable
novalidate;
alter table t1 add constraint pk_t1 primary key(c1)
enable novalidate
*
第 1 行出现错误:
ORA-02437: 无法验证 (TEST.PK_T1) - 违反主键
SQL> create
index idx_t1 on t1(c1);
索引已创建。
SQL> alter table
t1 add constraint pk_t1 primary key(c1) using index idx_t1 enab
le
novalidate;
表已更改。
相关文档:
Oracle
函
数之substr
关键字: substr
substr函数有三个参数,允许你将目标字符串的一部份输出,
第一个参数为目标字符串,
第二个字符串是将要输出的子串的起点,
第三个参数是将要输出的子串的长度。
例子1:
substr('ABCDEFG', 2, 3) ......
t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数差别相当大。下面是一些测试结果:
SQL> set timing on
SQL> select count(*) from t where instr(title,’手册’)>0;
COUNT(*)
—&md ......
搞oracle都会经常碰到rowid,本文是笔者根据网上各位的文章,加上自己学习中的体会,总结而成。
一.rowid简介
rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ......
不错的资料,转过来,方便日后查看使用!!!
--监控索引是否使用
alter index &index_name monitoring usage;
alter index &index_name nomonitoring usage;
select * from v$object_usage where index_name =
&index_name;
--求数据文件的I/O分布
select
df.name,phyrds,phywrts,phyblkrd,phyblkwrt,sin ......