日期:2014-05-17  浏览次数:21161 次

oracle数据类型以及约束
我的需求是:要保存一个密码到数据库,这个密码必须为6位数字。
如果我将number类型当做数据类型的话,假如最前面几位为0的话,直接用number保存,前面几位为0的就会丢失,所以我想用varcher类型保存,但是要加一个约束。也就是说这个约束必须满足下面几个条件:
1,大于0
2,必须为6位
3,必须全部为数字
我不想通过JAVA、C等语言在读取写入的时候去做判断,而是直接通过oracle数据库去完成这一工作,请问应该怎么做呢?
假如我的表是这样的:
表名:use  主键:use_id
use_id use_name  password
1      张三      001234
2      李四      022222

------解决方案--------------------
数据库是用来存东西的

java是用来实现逻辑的

何苦呢?

何况每次校验都要连接一次数据库,性能也不行啊。
------解决方案--------------------
引用:
没明白楼上的意思,你的意思是在oracle上面不加约束,而是在java加判断性能要好吗?
我倒是觉得在oracle里面加约束性能要好一些,因为在我看来,数据库只有一个,但是java类将会有很多个,假如有很多个JAVA类都要读写这一个表呢?那么我改进一个数据库肯定比改进很多个JAVA类要好要快,至于性能,我现在还真说不明白,毕竟没有实操过
在说了,我不这样做的话,密码就会有数据丢失,必然就会有……


个人赞成楼上的,业务逻辑在java/C等宿主语言中实现,这样效率上会好很多,尤其是当操作比较频繁的情形下。

存在多个类写一个表的情形,只能说明LZ的设计存在问题。尤其是象这种简单的应用。

密码会有数据丢失?用varchar2或者char保存,不会丢的。是建议你将密码的校验逻辑放在宿主语言中,没有建议你用number去存密码。
------解决方案--------------------
怕是没有你要求的这个约束哦..
你非不想用JAVA或C实现的话,只能用ORACLE了,可参考以下
CREATE TABLE usermsg(use_id NUMBER(5),use_name VARCHAR2(30),password VARCHAR2(6));
CREATE OR REPLACE PROCEDURE pusermsgins(p_id IN NUMBER,p_name IN VARCHAR2,ppassword IN VARCHAR2) IS 
v_password NUMBER; 
BEGIN 
  SELECT To_Number(ppassword) INTO v_password FROM dual;
  INSERT INTO usermsg VALUES (p_id,p_name,ppassword);
  COMMIT;
  EXCEPTION WHEN OTHERS THEN 
    raise_application_error(-20102,'** plz input the Correct password **' 
------解决方案--------------------
sqlerrm);
END;