对表中部分数据加约束,其它数据不加怎么做

[复制链接]
查看11 | 回复7 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
我在一个表中对type字段为1的记录,需要对name字段加一个唯一约束,而对type字段内容为其它的记录,不需要对name字段加约束,这种该怎么做?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
应该是无法通过约束做到这一点的。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
写个触发器控制一下吧!
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
可以通过9i的新功能:基于条件的唯一索引来做到。
可以创建一个基于函数的索引!

create unique index idx_indexname on tablename(decode(type, 1, name,
null))
Oracle数据库的初始化文件中需要设置的参数:

QUERY_REWRITE_ENABLED = true

QUERY_REWRITE_INTEGRITY = trusted


用户需要的权限:

如果创建自己拥有的表的索引,需要有QUERY REWRITE系统权限。

如果创建其它模式拥有的表的索引,需要有GLOBAL QUERY REWRITE权限。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
看來要好好學學9i了
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 totu_sz 发布
[B]可以通过9i的新功能:基于条件的唯一索引来做到。
可以创建一个基于函数的索引!

create unique index idx_indexname on tablename(decode(type, 1, name,
null))
Oracle数据库的初始化文件中需要设置的参数:

QUERY_REWRITE_ENABLED = true

QUERY_REWRITE_INTEGRITY = trusted


用户需要的权限:

如果创建自己拥有的表的索引,需要有QUERY REWRITE系统权限。

如果创建其它模式拥有的表的索引,需要有GLOBAL QUERY REWRITE权限。 [/B]


没用过,兄台能否给出详细的语法???
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
create unique index idx_indexname on tablename(decode(type, 1, name,
null))这不是详细的语法么?decode(type,1,name,null)就是一个函数,意思是表中有一个字段type,当type为1时就取name,type不为1就取null,这样就可以将所有type为1的记录取出来建立唯一index,而type是其它值的记录被过滤掉了。我试过,确实满足要求。
其它的函数应该也可以,具体函数清单我也没有,如果需要,可逐一去试。
另外用户需要的权限:
(QUERY REWRITE系统权限。)如果不好赋给,直接用dba的权限也可以为自已或其它用户创建这种index,创建完毕,那两个初始化参数可以改回,权限也可以收回。
基于函数的索引已经建立,就开始生效,使用这个索引和普通索引一样。

create unique index idx_indexname on tablename(decode(type, 1, name,
null), decode(type, 1, authorizescope,null)) --这是创建一个组合索引,基于name+authorizescope字段的。
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
最初由 totu_sz 发布
[B]create unique index idx_indexname on tablename(decode(type, 1, name,
null))这不是详细的语法么?decode(type,1,name,null)就是一个函数,意思是表中有一个字段type,当type为1时就取name,type不为1就取null,这样就可以将所有type为1的记录取出来建立唯一index,而type是其它值的记录被过滤掉了。我试过,确实满足要求。
其它的函数应该也可以,具体函数清单我也没有,如果需要,可逐一去试。
另外用户需要的权限:
(QUERY REWRITE系统权限。)如果不好赋给,直接用dba的权限也可以为自已或其它用户创建这种index,创建完毕,那两个初始化参数可以改回,权限也可以收回。
基于函数的索引已经建立,就开始生效,使用这个索引和普通索引一样。

create unique index idx_indexname on tablename(decode(type, 1, name,
null), decode(type, 1, authorizescope,null)) --这是创建一个组合索引,基于name+authorizescope字段的。 [/B]

我能看懂你的这个语句,我是意思是说你能不能写出创建这种基于条件的唯一索引的整体语法.(不仅仅是针对解决某一个特定问题的)
比如基于相等、范围、字段关联什么。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行