我刚学oracle,之前用SQLSERVER比较熟练,在建表的时候(咱们先手动的建,不靠SQL建)怎么才能实现象自增列,标识列,主键和外键的建立呢 ?
  百度一下,我才知道,Oracle里自增列叫序列,那么我在SA的方案下建了一个序列,手动。。
  那么我想请问的是,是否oracle不能实现增加数据库自动创建标试列,一定要seq_test.nextval获取下一个数字,再把这个数字加入数据库,是否是这么原始 ??(请原谅我,我是一名java程序员,刚毕业的,接触了sqlserver很方便的操作,现在决心做Java,碰到了oracle这座大山,我只能跨过去,不能回头了)
  麻烦高手们不要鄙视我,能不能简单的回答我,不要涉及太多的oracle专业知识,我只想先过这个坎,后面丰富的世界不是我这个等级能抗衡的,直接抗衡的下场除了畏惧,剩下的就是被秒杀。
  最后,真心的谢谢!!

解决方案 »

  1.   

    呵呵 其实你可以直接描述出你想要达到的效果 不用说这么多下面是序列基本用法 也不知道是不是你想要的 有什么问题跟帖再问吧
    SQL> create sequence tt increment by 1 start with 0 maxvalue 20 minvalue 0 cycle
    ;Sequence created.
    SQL> select tt.currval from dual;
    select tt.currval from dual
           *
    ERROR at line 1:
    ORA-08002: sequence TT.CURRVAL is not yet defined in this session
    --这里看到刚创建好序列直接引用CURRENT VALUE的话会出错SQL> select tt.nextval from dual;   NEXTVAL
    ----------
             0SQL> select tt.currval from dual;   CURRVAL
    ----------
             0
    SQL> create table t1(id number,name varchar2(20));Table created.SQL> insert into t1 values(tt.nextval,'test');1 row created.SQL> insert into t1 values(tt.nextval,'test');1 row created.SQL> insert into t1 values(tt.nextval,'test');1 row created.SQL> commit;Commit complete.SQL> select * from t1;        ID NAME
    ---------- --------------------
             1 test
             2 test
             3 test
      

  2.   


    是否oracle不能实现增加数据库自动创建标试列,一定要seq_test.nextval获取下一个数字,再把这个数字加入数据库,是否是这么原始 ??
    -------------------------------------------
    可以通过序列+触发器来实现SQLSERVER里的自增字段。序列你已经有了,seq_test,不一定需要手动的去插入数据库,写一个触发器让它自增就可以。
    CREATE OR REPLACE TRIGGER TRI_TEST 
    BEFORE INSERT ON 表名
    FOR EACH ROW 
    BEGIN 
      SELECT seq_test.NEXTVAL INTO :NEW.字段名 FROM dual; 
    END;
    /
    这样你的表中的字段就相当于SQLSERVER里的自增字段了,就不用手动去管它了。
      

  3.   

    熟悉mssql的话oracle很快就会上手的
    看看1楼的例子,大概能理解用法
    序列的创建有一些可选参数,楼主可以查下语法根据需要填写
      

  4.   

    3楼的触发器让我理解比较OK了,不过我真正想要的是手动创建,明白么 ??
    不是SQL创建,SQL创建百度一大把,我已经习惯了百度一下,你就知道。
    可惜百度不到,来CSDN碰下运气 ~~
    不过3楼的那个写法 ?
    SELECT seq_test.NEXTVAL INTO :NEW.字段名 FROM dual; 
    这句我不太明白,意思是从dual里查找下一个自增列的数字放入。。(放入什么 ?)
    谢谢指导!!!
    还有2楼的我看的都大部分明白了,谢谢指导!!
    不过
    --这里看到刚创建好序列直接引用CURRENT VALUE的话会出错
    这个我也有亲身体会,能不能简单的说下为什么会这样,对不起,我比较笨,原谅下,那怎么解决 ??简单的,再次谢谢大家!!
      

  5.   

    前面全正确后面这句就出错了SQL> insert into userinfo values(ace.nextval,'test');
    insert into userinfo values(ace.nextval,'test')
                *
    ERROR 位于第 1 行:
    ORA-00947: 没有足够的值
      

  6.   

    SQL> create table t1(id number,name varchar2(20));Table created.
    SQL> create sequence tt increment by 1 start with 0 maxvalue 20 minvalue 0 cycle;Sequence created.
    SQL> CREATE OR REPLACE TRIGGER TRI_TEST
      2  BEFORE INSERT ON t1
      3  FOR EACH ROW
      4  BEGIN
      5    SELECT tt.NEXTVAL INTO :NEW.id FROM dual;--这句的意思就是取出序列的下一个值把它赋值给新插入数据的id字段 因为在插入的时候你没有指定id字段的值 只指定name字段的值就可以了
      6  END;
      7  /Trigger created.SQL> insert into t1(name) values('one');1 row created.SQL> insert into t1(name) values('two');1 row created.SQL> select * from t1
      2  ;        ID NAME
    ---------- --------------------
             1 one
             2 two
      

  7.   

    一:创建一个序列实现递增 create sequence sequence_name
      start with 1                --设定起始值
      increment by 1              --设定递增值
      maxvalue  999999999         --设定最大值
      order;                      --指定序列号按要求的次序产生
    二:创建一个触发器,引用序列的值,为了确保只能插入或者删除而不能修改,要考虑两种情况 create or replace trigger trigger_name
    before insert or update on table_name
    for each row
    begin
        if inserting then
            select sequence_name.nextval into :new.column_name;
        end if;
        if updating('column_name') then
            raise_application_error('-20001','不能修改 column_name 列的值!');
        end if;
    end;
    说明: 
        table_name  就是你要操作的表名 
        column_name 就是你要递增的那个字段 
      

  8.   

    连接到: 
    Oracle9i Release 9.2.0.1.0 - Production
    JServer Release 9.2.0.1.0 - ProductionSQL> create table t1(id number,name varchar(20));表已创建。SQL> create sequence tt increment by 1 start with 0 maxvalue 999999 minvalue 0 cycle;序列已创建。SQL> create or replace trigger tri
      2  before insert on t1
      3  for each row
      4  begin
      5  select tt.nextval into :new.id from dual;
      6  end;
      7  /触发器已创建SQL> insert into t1 values('one');
    insert into t1 values('one')
                *
    ERROR 位于第 1 行:
    ORA-00947: 没有足够的值
    SQL> insert into t1(name) values('one');已创建 1 行。SQL> select * from t1
      2  ;        ID NAME
    ---------- --------------------
             0 one谢谢,我已经会了,但是还有一些疑点,请教下!!!1:create sequence tt increment by 1 start with 0 maxvalue 999999 minvalue 0 cycle
    里面increment by 1是什么意思 ? 
    minvalue 0 cycle 最小值是关于什么的?
    cycle是什么意思?2:for each row
    这个是什么意思?我只会点英语,意思我猜是循环行 ?如果是这个意思,为什么要 ?3:select tt.nextval into :new.id from dual;
    :new.id 除了后面的id,前面:new是不是固定的 ?如果不是,那代表是什么意思?4:6  end;
       7  /
    第7行为什么要加个“/”才能成功结束 ??5:SQL> insert into t1 values('one');
    insert into t1 values('one')
                *
    ERROR 位于第 1 行:
    ORA-00947: 没有足够的值
    正确的是:insert into t1(name) values('one');是不是以后的插入都必须把列名写出来才行 ??6:最后个问题,能不能帮我建2张表,我想学习主外键关系是怎么出来的 ~~~谢谢
    id  name pid
    id  pname
    两张表都有主键,pid是外键我准备做个只有一个页面的网站,被oracle这些关系拖了3天了,望高手们不要嫌弃我,第6个问题务必帮忙,再此谢过!祝好心人长命百岁!!
      

  9.   

    BenChiM888不好意思,我回头再仔细看下你的回答,我看到了increment by 1,递增的值,谢谢!
    if updating('column_name') then
            raise_application_error('-20001','不能修改 column_name 列的值!');
        end if;
    这句话是什么意思呢 ?
    更新某个字段的时候,报出中文错误 ??
      

  10.   

    1:create sequence tt increment by 1 start with 0 maxvalue 999999 minvalue 0 cycle 
    里面increment by 1是什么意思 ? 
    每次值自增1的意思minvalue 0 cycle 最小值是关于什么的? 
    cycle是什么意思? 
    增加到最大值时会返回初始值继续增加2:for each row 
    这个是什么意思?我只会点英语,意思我猜是循环行 ?如果是这个意思,为什么要 ? 
    如果插入了5条数据 对每一条都触发一次3:select tt.nextval into :new.id from dual; 
    :new.id 除了后面的id,前面:new是不是固定的 ?如果不是,那代表是什么意思? 
    :NEW代表新插入的那一条记录4:6  end;   7  / 
    第7行为什么要加个“/”才能成功结束 ?? 语法就是这么规定的5:SQL> insert into t1 values('one'); 
    insert into t1 values('one') 
                * 
    ERROR 位于第 1 行: 
    ORA-00947: 没有足够的值 
    正确的是:insert into t1(name) values('one'); 是不是以后的插入都必须把列名写出来才行 ?? 就这里的情况来说 是的6:最后个问题,能不能帮我建2张表,我想学习主外键关系是怎么出来的 ~~~谢谢 
    id  name pid 
    id  pname 
    两张表都有主键,pid是外键 
    SQL> create table t2(id number primary key,pname varchar2(20));Table created.
    SQL> create table t1(id number primary key,name varchar2(20),pid number REFERENC
    ES t2(id));
    SQL> insert into t2 values(1,'wh');1 row created.SQL> commit;Commit complete.SQL> insert into t1 values(1,'wp',2);
    insert into t1 values(1,'wp',2)
    *
    ERROR at line 1:
    ORA-02291: integrity constraint (SCOTT.SYS_C0022953) violated - parent key not
    found--这里由于t2中没有id=2的记录 所以插入失败 违反外键约束
    SQL> insert into t1 values(1,'wp',1);1 row created.SQL> commit;Commit complete.SQL> select * from t1;        ID NAME                        PID
    ---------- -------------------- ----------
             1 wp                            1SQL> select * from t2;        ID PNAME
    ---------- --------------------
             1 wh
      

  11.   


    if updating('column_name') 
    的意思是,如果你试图修改这个列的值,oracle抛出异常,并回滚事务保证数据不可改。
    raise_application_error('-20001','不能修改 column_name 列的值!');
    的作用是抛出异常,sqlcode 是自己定义的 oracle允许从 -20000 .. -20999 自定义返回的sqlcode
      

  12.   

    5:SQL> insert into t1 values('one'); 
    insert into t1 values('one') 
                * 
    ERROR 位于第 1 行: 
    ORA-00947: 没有足够的值 
    正确的是:insert into t1(name) values('one'); 是不是以后的插入都必须把列名写出来才行 ?? 可以这么写insert into t1 values(1,'one');第一个位置随便写,写什么都会被触发器替换成序列的值,不用担心。
      

  13.   

    我看的稍微有点明白了,就是在角色和用户,权限和角色中加个逻辑表,来满足多对多的需求,但具体的设计还是比较蒙的,虽然.net有做过类似的,但都不是太正式的
    说实话,我是个会做不会说的,今年9月份毕业,到现在快12月了还找不到活,家里天天吵架,人活的也是越来越没自信了,工作找不到原因就是在说上面,很简单的DWR是做什么的,我就只知道javascript中调java类的,其他真是不会说了,所以盘盘工作面试盘盘被刷掉,其中有三次机会是可以上的,第一次说1年熟悉业务,3年项目总监,再2年项目经理,刚出道的我对着项目经理说了这些话,这是我第一次面试,表现的自信太过高了。。直接被FIRE了,实在冤枉,我只是想表现自己有自信而已第二次,已经成功了,突然又不收了,第三次准备收了,后面来了个喊我会JSP开发的MM,直接被刷了,接下来就没了。。
    既然我不能用说话来证明自己,所以我去看当当网,卓越亚马逊,自己做个大项目,来证明自己,同毕业的同学太忙了,没空帮到自己,没工作的人把我当成敌人,问一些问题也不象以前那样有味道了,所以,关于用户角色权限这个忙,虽然我自己能看的懂,只是时间问题,但如果从有经验的人帮忙,我就能少走的弯路,如果可以的话谢谢前辈们了!!!谢谢!!
      

  14.   

    用户id name 用户角色表id 用户ID  角色ID角色表id name角色权限表id 角色ID  权限字符串(跳页面后DWR传入参数,相当于.NET里的页面地址)
    权限表id 权限字符串 dec描述   权限缩写(IDUS)是这样的么 ??
      

  15.   

    呵呵 不用这么客气
    这里和百度差不多 发帖子的时候不是有设置分数的么
    只不过百度可以再追加分 这里好像不行以后有问题就来CSDN问吧 这样大家还能回帖讨论
    百度有时候人家回答你一次就不来了 有疑问也问不了(我怎么像给CSDN做广告的) 
      

  16.   

     好的,我还有很多问题请教呢,.net有缓存,java的缓存有没简单点的缓存,我懂一点JCS的缓存,但是好象老运行错误,我做的项目需要缓存,因为有购物车的存在,有没谁知道比较简单一点的缓存,但基本的是,能存能放,然后必须有方法能指定过期时间的,最好是有缓存过期时的状态能进行捕捉的!~~谢谢!
      

  17.   

    还有一些我必须考虑,缓存内的一个对象有多大  ?
    是按对象的来算,还是 ?
    还有就是按一基本id name password的正常的javaBean来算,在缓存中占多大内存 ?
    有知道的,麻烦告诉我下,谢谢 !!
      

  18.   

    这里是ORACLE板块啊
    其他的问题可以到相关板块问嘛
    呵呵 不然你一口气问这么多
    除非谁比较全能 就可以都回答你了
      

  19.   

    lz别急慢慢来。
    另外wh62592855我还有个问题问你。在ocp那个帖子里,麻烦你看看。
      

  20.   

    那好吧,就问oracle初次用的是oracle 9i版本的
    感觉十分原始,自己琢磨建个表花了2个小时我想问的是,oracle很强大,但能不能说下相比.net的sqlserver来说,oracle好在哪,不好在哪?我想问的是,比较白目的话,不用高深的话,比如一个胖子在吃东西,好在他很有胃口,不好在又多了一个胖子,我只是要知道这个,然后我再根据自己的兴趣或者必须的地方再去研究,就这样吧,谢谢啊 !!~兔子哥
      

  21.   

    呵呵 其实这种对比的问题最难回答了 
    就像以前我问老师一个问题"C语言和JAVA哪个好"
    老师一头汗……如果你只是想在.NET环境下连上数据库开发个小系统的话那么就用SQLSERVER吧
    毕竟都是微软的产品 连接和操作都会稍微方便一些
      

  22.   

    好吧,我明白了
    现在是这样的情况String a = "<button id='a1' onclick='Work('XXX')'>";
    这样的一个字符串,在onclick='Work('XXX')' 中出现了错误,就是''符号的问题请问该怎么解决 ?
    我必须放在字符串里
      

  23.   


    如果你知道红色字的原理,并且能实现,那蓝色的字才有可能实现oracle建议多看点书吧,这个问题你看看书比在论坛上问快多了
      

  24.   

    小偷程序你知道的话能说下大概的原理么 ??还有,我学习的方法不是靠看书,我也看不懂,字一多就晕我有个问题想问下,这样子的本来javascript写在页面上的,但可以写在一个JS文件里,在页面中导入也可以实现现在情况是这样子的,我页面上已经有了
    <script type='text/javascript' src='/Ace/dwr/interface/WorkService.js'></script>
    <script type='text/javascript' src='/Ace/dwr/engine.js'></script>
    <script type='text/javascript' src='/Ace/dwr/util.js'></script>DWR的配置,我想在JS文件里调用Java类,可是经过alert检查,发现不行,一调用就报error的错误框我想问的是,是不是不能这样,一定要写在页面上,我所指的是DWR ?
    如果不是,有什么办法能解决的 ??
    谢谢高手帮忙 !!
      

  25.   

    高手们晚上好 !!我想问一个关于oracle的问题,麻烦请教下 !!第一张图是数据,他们为什么在表里显示的长短不一 ??第二张是结果,为什么会出现这样的长短不一,是否有好的解决办法,除了加表格外,是否就没别的办法 ?谢谢!!
      

  26.   

    呵呵 怎么越来越乱了首先 
    你的图片没发出阿里其次
    你怎么又申请了个号来问再次
    问的问题最好和ORACLE相关
      

  27.   


    你的学习习惯不好,不看书,难道让人教你?大家都在工作凭什么别人要教你?你说的小偷程序就是网页爬虫,baidu上搜一下吧http://www.baidu.com/s?wd=httpclient+%CD%F8%D2%B3%C5%C0%B3%E6一搜一大把,呵呵
      

  28.   

      我的学习习惯是直接看代码,自己理解,自己动手,自己在联想,再实验~
      我不可能在这里问完后等别人的答案,我这一天回复一次那我还学习什么,我只是在这里问下,然后自己找答案,找不到回来看一下,两管齐下而已
      那行,网页爬虫谢谢啊!
      
      今天又有问题了,还有兔子哥,我的问题虽然杂但我并没有乱搞主题啊,我的主题还是一个啊,我只是把问题寄托在这里,如果有人能知道的话我而我还不知道的话我就能看下
      
      每天都有问题,每天都有进步,每天都在学习,每天都有收获,这样不好吗?眼睛哥
      
      今天的问题是,jquery的ajax请求struts2,struts2的返回值我希望能是一个String,虽然他就是个String,但虽然我不看书不能明白他的意思,网上一大堆全是粘贴+炫耀自己技术多么牛B,完全不顾别人有没这个等级看的懂,上面都明白你是在教人,虽然也许是我废,但起码也代码有一部分的人是和我一样的想法  不说了,就这个问题,摆脱如果你知道能否指点一二,如果说帮助人大不过在一个版块里发同一个帖子,那么能否指点一二就行~~谢谢 !!
      

  29.   

      帮助人是我的快乐,眼睛哥,也许你不这么想,但我的希望的世界是我们小时候唱的一首歌:
      敬个礼,握握手,我们都是好朋友!
      也许世俗能影响了你,但如果每个人都能被影响,CSDN还会建成功么 ?
      
      不要伤和气,我是来问题的,我这人有一说一,有二说二
      你的学习习惯不好,不看书,难道让人教你?大家都在工作凭什么别人要教你?
      我不喜欢这句话,所以话多了点,对不起哈 ~~~
      

  30.   

      今天学到一半被老师喊去面试了,估计能成,另外一个学第刚毕业,没我条件好,我起码自学了很多。
      但那个HR说一年到晚都要加班,中间只给几天时间休息,怎么办啊 ??
      人家去的公司都是5天8个小时制的,还有节假日休息,我的命真苦~~
      你们说是不是那个HR在吓我,考验我肯不肯加班啊,这个公司还满大,中等吧,你们说是不是在吓我啊 ??
      我都被吓瘫了,是不是真有这样的事存在啊 ??  大家知道的说下啊 !~
      

  31.   

    呵呵 同学好学是好事情
    可是你一会问数据库 一会问js 一会又到java里面的东西我很想回答你的问题 可惜我对你后面问的问题不太了解呵呵 还有 学习还是要看书的 你的那种方法可能短期里看起来会比较有效
    不过有点"无本之木"的感觉
    这也就是为什么你会一次性问这么一大堆问题的原因
      

  32.   

      11.动态INCLUDE和静态INCLUDE的区别?
       12.jsp多少个动作,分别说明下?
    倒霉,被理论搞死了,我就不懂了,为什么那么死抓着理论知识呢 ?1.String和StringBuffer的区别 不懂不照样能做项目
      

  33.   

      我该学什么呢 ?
      我都不知道该学什么了,有什么好的建议吗?
      如果想当一名合格的JAVA程序员,我还应该去学什么吗 ?
      
      

  34.   

    目前Oracle还没手动的实现这个方法,只能用3楼 序列+触发器的方法实现。
    你的问题太多了,你找一本Oracle的书系统看下能解决问题,很多是语法的问题。
      

  35.   

                    function Ac(){
       var user =     
        {     
            "username":"andy",     
            "age":"20"         
        }     
             
        alert(user.username);     
       }这次是Json,这样子在javascript里alert出错
    谁知道的麻烦说下嘛,他们说不用加包,直接写,我老错。。还有啊      function Work(){
       PB.getText('c',0,
       function (data){
       var c = {
       data
       }
       alert(c.product[0].id);
       }
       );
         }这是个DWR调类后传回个String,我该怎么让他成为json对象,然后拿出来 ??请大家原谅我看不了书的习惯,我本身是个懒惰的人,又不爱学习,从小到大,全科最高只拿过90分,我之所以现在什么都学是想有能力找份工作,家里的父母老受亲戚的气,老被欺负,我几乎每次碰到他们,他们那些亲戚马上就说,看吧看吧,白花钱,哈哈,我看的就叼火,所以才有动力一天学一个知识,麻烦不要再给我说看书,没钱没精力,对你们来说有用,对我来说费力不讨好,我今年25了,还没工作,我没有时间认真的从头看到尾,我只需要学我该学的,有直接作用的,不是一大堆理论,也许这样是错的,但只能顾眼前了所以,你如果知道这问题的话,麻烦告诉我下,如果觉的在oracle里不能回贴被的内容,那么规矩是死的,人是活的,给我发论坛短消息吧,好人一生平安!!
      

  36.   

    Json已经学会,上面做废,谢谢 !