《oracle总结仅参考.doc》由会员分享,可在线阅读,更多相关《oracle总结仅参考.doc(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、oracle总结oracle总结1.SQL与ORACLE的物理结构总得讲,它们的物理结构很相似,SQL的数据库相当于ORACLE的模式(方案),SQL的文件组相当于ORACLE的表空间,作用都是均衡DISKI/O,SQL创建表时,可以指定表在不同的文件组,ORACLE则可以指定不同的表空间。Oracle创建表时创建到当前用户名的默认表空间中,所以创建用户时要制定默认的表空间。CREATETABLEA001(IDDECIMAL(8,0)ON文件组-CREATETABLEA001(IDNUMBER(8,0)TABLESPACE表空间注:以后所有示例,先SQL,后ORACLE2.SQL与ORACLE
2、的外键约束SQL的外键约束可以实现级联删除与级联更新,ORACLE则只充许级联删除。CREATETABLEA001(IDINTPRIMARYKEY,NAMEVARCHAR(20)CREATETABLEA002(IDINTREFERENCESA001(ID)ONDELETECASCADEONUPDATECASCADE,AGETINYINT)CREATETABLEA001(IDINTPRIMAYKEY,NAMEVARCHAR2(20)CREATETABLEA002(IDINTREFERENCESA001(ID)ONDELETECASCADE,AGENUMBER(2,0)3.SQL与ORACLE的类
3、型转换SQL常用类型转换函数有:CAST、CONVERT、STRORACLE常用类型转换函数有:TO_CHAR、TO_NUMBER、TO_DATESELECTCONVERT(VARCHAR(20),GETDATE(),112)-SELECTTO_CHAR(SYSDATE,YYYYMMDD)FROMDUAL4.SQL与ORACLE的自动编号SQL的编号一般由IDENTITY字段来提供,可以灵活地设定种子值,增量,取值范围有BIGINT、INT、SMALLINT、TINYINT、DEIMAL等;ORACLE的编号一般由SEQUENCE来提供,由NEXTVAL与CURVAL函数从SEQUENCES取
4、值。CREATETABLEA003(IDINTIDENTITY(-9999,9),NAMEVARCHAR(20)-CREATESEQUENCESEQ_001START9999INCREMENTBY9CREATETABLEA004(IDINT)INSERTINTOA004VALUES(SEQ_001.NEXTVAL)INSERTINTOA004VALUES(SEQ_001.CURVAL+1)5.SQL与ORACLE的分区表从严格意思上来讲,SQL还没有分区表,它的分区表是以UNION为基础,将多个结果集串起来,实际上是视图;ORACLE的分区表有多种:PARTITIONBYRANGE、PARTI
5、TIONBYHASH、PARTITIONBYLIST,其它就是混合分区,以上三种基础分区的混合使用。当然ORACLE也可以象SQL那样分区视图。CREATETABLEA1999(IDINT,NAMEVARCHAR(20)CREATETABLEA2022(IDINT,NAMEVARCHAR(20)CREATEVIEWV_PARTASSELECT*FROMA1999UNIONSELECT*FROMA2022-CREATETABLEA_PART1(IDINT,NAMEVARCHAR2(20)6.7.8.9.10.11.PARTITONBYRANGE(ID)(PARTITIONP1VALUESLESS
6、THEN(2022000)PATITIONP2VALUESLESSTHEN(MAXVALUE)CREATETABLEA_PART2(IDINT,NAMEVARCHAR2(20)PARTITIONBYHASH(ID)PARTITIONS2STOREIN(USERS01,USERS02)CREATETABLEA_PART3(IDINT,NAMEVARCHAR2(20)PARTITIONBYLIST(ID)(PARTIIONP1VALUES(01,03,05)PARTITONP2VALUES(02,04)SQL的字符串连接用+号,ORACLE字符串连接用|,单引号可以做转义符。SQL与ORACLE的
7、动态SQLSQL与ORACLE都支持动态SQL语句,SQL用EXEC()执行的动态SQL语句,ORACLE用EXECUTEIMMEDIATE执行动态SQL。DECLARESQLVARCHAR(99)SELECTSQL=declaremintselectm=count(*)fromsysobjectsselectmEXEC(SQL)-DECLARESVARCHAR2(99);BEGINS:=SELECTCOUNT(*)FROM|USER_TABLES;EXECUTEIMMEDIATES;END;返回记录集中前N条记录的语法?SQL只有使用TOP,ORACLE可以使用ROWNUMSELECTTOP
8、N*FROM记录集(表,视图,子查询)-SELECT*FROM记录集WHEREROWNUMCREATESEQUENCESEQnameINCREMENTBY1STARTWITH1MAXVALUE99999999/创建触发器CREATETRIGGERTRGnameBEFOREINSERTONtable_nameREFERENCINGNEWAS:NEWFOREACHROWBeginSELECTSEQname.NEXTVALINTO:NEW.FIELDnameFROMDUAL;End;Java连接oracletryClass.forName(oracle.jdbc.driver.OracleDrive
9、r);Stringurl=jdbc:oracle:thin:主机名:端口号:数据库名;/Stringuser=xxxt;/登录数据库的用户名Stringpassword=xxx;/密码trycon=DriverManager.getConnection(url,user,password);catch(Exceptione)System.out.println(error+e.getMessage();catch(Exceptione)System.out.println(error+e.getMessage();扩展阅读:Oracle总结Oracle一些概念Linux中登录oracle的命令
10、:sqlplus用户名/密码showuser显示当前登录的身份.setpauseon(网页中分页)setpauseoff分页显示(SQL*plus中在网页中是不分页).oracle中默认日期和字符是左对齐,数字是右对齐tableorviewdoesnotexist;表或示图不存在edit命令用于自动打开vi修改刚修执行过的sql的命令。查看表的结构(包含的字段):descs_dept(控制台);descdept(浏览器)查询:selecttable_namefromuser_tables;(控制台)一、数据库基本概念1)数据库管理系统:一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据
11、库,Oracle、DB2、Mysql、MSServer;2)数据库:按照数据结构来组织、存储和管理数据的仓库。3)数据:4)表(Table):数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row)和列(Column)组成的。5)视图:其实是一个虚拟的表,在数据库中并不实际存在。视图数据是由查询数据库表产生的,它限制了用户能看到和修改的数据。6)索引:索引是根据指定的数据库表列建立起来的顺序。它提供了快速访问数据的途径,并且可监督表的数据,使其索引所指向的列中的数据不重复。7)存储过程:存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。8)
12、触发器:触发器是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。9)ER图:实体关系图10)范式:第一范式:数据库表的每一列都是不可分割的基本数据项;第二范式:要求实体的属性完全依赖于主关键字primarykey:SelectCourse表(学号,姓名,年龄,课程名称,成绩,学分)1、数据冗余2、更新异常3、插入异常4、删除异常第三范式:数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖;11)事务特性:原子性、一致性、隔离性、持久性设置oracle事务隔离界别:settransactionisolationlevelserializabl
13、e;未提交读:事务A可以读取事务B未提交的数据。提交读:事务A只能读取事务B提交了的数据可重复读:在同一个事务A里,先后执行同一个查询语句,得到的结果是一样的。序列化读:事务A在执行的时候不允许其他事务的执行,隔离级别最高。12)SQL:结构化查询语言,是操作关系型数据库中的对象。二、SQL语句SQLStatement(SQL语句)1)DDLDataDefinationLanguage数据库定义语言create,alter,drop,truncate2)DMLDataManagementLanguage数据库操纵语言insert,upate,delete3)DCLDataControlLang
14、uage数据库控制语言grantrevoke4)TCLTransactionControlLanguage)数据库事务控制语言commit,rollback,savepoint5)Select数据库查询语句Select三、数据库查询1、查询操作1)投影操作只查询表的某些字段如:selectname,birthdayfromstudent;2)关联操作多个表操作3)选择操作根据条件筛选记录,可认为是添加了where子句2、查询语句selectdintinct*,columnalias,fromtablename;1)投影操作selecttable_namefromuser_tables;查询系统
15、表desc表名;查看表的结构去重复数据distinct例:selectdistinctdept_id,titlefroms_emp;这样写的话,distinct会管到后面的所有字段,即对所有字段排序后,再排重。即排重的是dept_id和title的组合。在select语句中可以使用数学表达式。selectfirst_name,salary*12froms_emp;别名,三种方法1、selectfirst_namenamefroms_emp;2、selectfirst_nameasnamefroms_emp;3、selectfirst_namefirstnamefroms_emp;如果别名中有空
16、格或大小写敏感,要把双引号括起来;父查询可调用子查询的别名,当前查询调用当前别名需要看执行顺序;双引号别名调用时仍需双引号但是内部字母区分大小写;且识别空格,有多少是多少;多个空格在显示时只有一个空格,无空格则不显示,这是和使用相区别;只有双引号中能添加空格;若别名中有空格则加上”字符串拼接使用|符号selectfirst_name|last_namefroms_emp;(|无论哪里出现空格都对拼接无障碍且无空格显示)空值的处理-nvl(column,defaultvalue)函数selectfirst_name,12*salary*(1+nvl(commission_pct/100,0)fr
17、oms_emp;nvl函数是指当第一个参数column如果为空(null值)的话,Oracle就会默认为第二个参数defaultvalue的值,如果第一个参数不为空的话,就选择第一个参数本身的值。内容区分大小写;2)选择操作:排序orderby字段|别名|字段位置升序(asc)|降序(desc)selectfirst_name,salaryfroms_emporderbysalary;默认的是升序排序字段的空值处理降序时null值排在前,升序时null排在后selectfirst_name,salaryfroms_emporderbyfirst_name,salarydesc;按first_n
18、ame升序排序,如果first_name相同,再按salary排序能够触发排序的关键字:distinct、orderby、groupby3、where子句where子句使用在select.from.后面,用来选择所需(符合条件的)的记录where后面跟的是表达式也就是XXX=XXX,XXXbetweenXandX,XXXin(X,X,X),like.等请注意selectcolumnsfromtablewhereclause是先from表再where条件,最后select出你要的字段。非数字类单引号引用;1)通配查询between.and.表示结果在这区间之间,betweenand是一个闭区间,
19、也就相当于.=.。!=,=,这三个都是指不等于,且=,=,这些运算符也可以使用。in(va1,val2,.)表示判断结果是否在这个枚举中存在,即每一个值都去匹配like表示字符串通配查询,%表示任意多个字符,_,表示任意一个字符。注意:转义的用法:likeS_%escape;escape指定义什么是转义符,可以是任意的特殊符号,包括数字和字符串,但数字和字符串要是定义为转义符会不会对操作造成影响需要考虑考虑。2)逻辑符and表示只有两个或多个条件同时满足。or表示条件只要满足其中只一就可以。all表示条件都满足时。not表示是可以与以上的条件产生反效果。空值会对notin造成影响,也就是不等于
20、任何值,但是空值例外,空值跟任何值比较都为空。notin不包含空值,null不被算在内。不包含在里面的值可能是有空值但是空值会被notin排除在。isnull表示判断值是否为空。注意:Oracle中的字符串是严格区分大小写的。这里所谓的字符串是指数据表中的数据(信息)。select*,columnsalias,.在这里实现投影操作fromtable_namewhereclause查询条件注意:表示这部分内容可有可无orderbycolumns(asc|desc)排序子句注意:表示这部分内容可有可无;(|)选择其一四、单行函数1、字符函数lower(字段名)表示转小写,其中的参数可以是一个字符串
21、常量或是一个字段名upper(字段名)表示转每个单词首字母大写;initcap(字段名)表示首字母大写;concat(字段1,字段2)表示字符串拼接;(|)substr(字段名,起始位置,取字符个数)表示截取字符子串,位置是从1开始length(字段名)表示该字段的字符长度,打出字符串长度例:selectsubstr(first_name,-2,2)subfroms_emp;(取后两个)selectsubstr(first_name,2,2)subfroms_emp;(取前两个)使用-表示取后面的字符串,取的时候仍是从左往右取。2、数值函数round(数据,保留小数点后几位)表示四舍五入可以用
22、负数表示小数点前,0,表示小数点后第一位,也就是保留个位,-1表示个位(保留到十位);小数点后面的位数可以为负数;从小数点处开始数,向左为负,向右为正。例:selectround(15.36,1)fromdual;trunc(数据,保留的位数(小数点后位数))表示截取数字函数,截取个位之后补0;小数点后面的位数可以为负数;从小数点处开始数,向左为负,向右为正。在边截取整数位数字后补零;例:selecttrunc(123.456,1)fromdual;3、日期函数日期格式,全日期格式世纪信息,年月日,时分秒。缺省日期格式,日-月-年dd-mon-rr修改当前会话的日期格式,会按照指定的格式输出日
23、期altersessionsetnls_date_format=yyyymmddhh24:mi:ss;返回当前日期sysdate例:selectsysdatefromdual;selectsysdate+1fromdual;获得明天的日期,加1,单位是天日期是格式敏感的日期内置函数:months_between(sysdate,addmonth(sysdate,5))/两个月有多少天。add_months(sysdate,-5)在系统时间基础上延迟5月add_months(sysdate,-5*12)在系统时间基础上延迟5年last_day(sysdate)一个月最后一天next_day(sy
24、sdate,Friday)下个星期星期几round(sysdate,day)不是四除五入,是过了中午的留下,不过的略掉trunc(sysdate,month)不到一月的都省略例:round(25-MAY-95,MONTH)01-JUN-95round(25-MAY-95,YEAR)01-JAN-95trunc(25-MAY-95,MONTH)01-MAY-95trunc(25-MAY-95,YEAR)01-JAN-954、不同数据类型间转换函数将字符转换成数字to_number(.)将数字转字符to_char(number,fmt)fmt是数字格式将字符串转成日期to_date(.,日期格式)
25、例:selectto_char(to_date(20221103,yyyymmdd),dd-month-yy)fromdual;selectto_char(3456.789,9,999.999)fromdept;变成一个字符串的格式,9是一种显示格式,运行结果3,456.789除了9之外还可以写0,本位上有的话直接写,没有的话补0selectto_char(3456.78,000,000.000)fromdept;运行结果003,456.780selectto_char(3456.78,fm$99,000.000)fromdept;去除前面的空格selectto_number(123.4)+3
26、fromdept;有默认的转换即去掉to_number,不同类型的转换可以强行也可以自动(不是所有的都可以)格式是9时:9的整数个数不能小于数字的整数位数,小数部分没有的话会补00时:0的整数个数不能小于数字的整数位数,前后没有的都补0改变NLS_LANG的值让输出结果的货币单位是¥或$,需修改环境变量,临时的即可setenvNLS_LANGSIMPLIFIEDCHINESE_CHINA.ZHS16GBKsetenvNLS_LANGAMERICAN_AMERICA.US7ASCII在XP系统的浏览器或Oracle的PLSQL中可使用下面指令修改语言环境,之后并且要输入commit提交:ALTE
27、RSESSIONSETNLS_LANGUAGE=american;ALTERSESSIONSETNLS_LANGUAGE=SIMPLIFIEDCHINESE;5、关联操作等值查询:表之间的连接是通过相等的字段值连接起来的查询称为等值连接查询。查询员工的名称,部门名称,地区名称selecte.first_name,d.name,r.namefroms_empe,s_deptd,s_regionrwheree.dept_id=d.idandd.region_id=r.id;查询ben在那个部门那个地区上班selecte.first_name,d.name,r.namefroms_empe,s_de
28、ptd,s_regionrwheree.dept_id=d.idandd.region_id=r.idandlower(e.first_name)=ben;非等值连接:连接条件使用除等于运算符以外的其它比较运算符,比较被连接的列的列值。这些运算符包括、=、e,s_empmwheree.manager_id=m.id(+);有(+)表示本方会为对方补空值注意条件(+)跟在要全部选出的一方,即一方比一方多余的记录要输出的加(+),不能使用in和or;fromt1,t2wheret1.c1=t2.c2(+)把t1表中匹配不上的记录重新找回来fromt1,t2wheret1.c1(+)=t2.c2把t
29、2表中匹配不上的记录重新找回来Selfjoin自连接Fromt1,t2Wheret1。C1=t2。C2(innerjoin)Fromt1,t2Wheret1。C1=t2。C2(+)(outerjoin)T1表中匹配不上的记录找回来Wheret1。C1(+)=t2。C2T2表中匹配不上的记录找回来Outerjoin=innerjoin+匹配不上来的;五、组函数1、groupby表示分组函数,having表示对查询结果进行过滤where子句用来筛选from子句中指定的操作所产生的行,不能跟组函数groupby子句用来分组where子句的输出having子句用来从分组的结果中筛选行2、组函数a)av
30、g查询平均值b)count查询记录条件,参数可以是任何类型,忽略空值;多少条记录不包含空值;c)max查询最大值,字符串从左边第一个开始比,第一相同就比第二个,第一个不相同大的徘前面;d)min查询最小值e)sum查询数字的和,貌似只用于数字,反正字符串不能用;所有组函数的计算都会忽略空值avg、sum只能用于数值类型3、注意:groupby子句也会触发排序操作,会按分组字段排序,即使用orderby查询提成平均值selectavg(nvl(commission_pct,0)froms_emp;查询员工分布在几个不同的部门selectcount(distinctdept_id)froms_em
31、p;查询42部门的平均工资selectavg(salary)salaryfroms_empwheredept_id=42;查询不同部门的平均工资selecte.dept_id,avg(salary)froms_empegroupbye.dept_id;查询不同部门不同职位的平均工资selecte.dept_id,e.title,avg(salary)froms_empegroupbye.dept_id,e.title;注意:当使用groupby语句时,select后面的只能是组函数和groupby后面的字段,若不使用groupby语句时,select后面的可以是普通字段或者全部是组函数查询不同
32、部门不同职位的平均工资(要求显示部门名称)selectd.name,e.title,avg(salary)froms_empe,s_deptdwheree.dept_id=d.idgroupbyd.name,e.title;查询不同部门的平均工资(要求显示部门名称)根据部门编号和部门名称分组selecte.dept_id,d.name,avg(salary)froms_empe,s_deptdwheree.dept_id=d.idgroupbye.dept_id,d.name;求42部门的平均工资selecte.dept_id,max(d.name),avg(salary)froms_empe
33、,s_deptdwheree.dept_id=d.idandd.id=42groupbye.dept_id4、SQL结构SELECT*,COLUMN1ALIAS1,.FROMTABLE_NAMEWHERECLAUSE查询条件GROUPBYHAVINGORDERBYCLAUSE排序子句5、子查询:就是可以嵌在任何的sql语句中的select语句,把子查询的结果当做范围再区查询一遍在select语句中嵌套子查询时,会先执行子查询。一般的会将子查询放在运算符的右边注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值),还是多行运算符(范围,多值,in)。配合使用子查询返回的结果必须符合运
34、算符的用法查询和smith做同样工作的员工selectlast_namefroms_empwheretitle=(selecttitlefroms_empwherelower(last_name)=smith)andlower(last_name)smith;selectlast_namefroms_empwheretitlein(selecttitlefroms_empwherelower(last_name)=smith)andlower(last_name)smith;如果能保证子查询结果为单值可以用=,如果不确定可以用in查询大于32部门平均工资部门的平均工资selectdept_id
35、,avg(salary)froms_empgroupbydept_idhavingavg(salary)(selectavg(salary)froms_empwheredept_id=32);查询哪些人不是领导selectfirst_namefroms_empwhereidnotin(selectmanager_idfroms_empwheremanager_idisnotnull);哪些员工的工资和本部门的平均工资一样selectfirst_name,dept_id,salaryfroms_empwhere(dept_id,salary)in(selectdept_id,avg(salary
36、)froms_empgroupbydept_id);6、rownum实现分页oracle查询前十条语句select*from(selectA.*,rowmunrnfrom(select*froms_emp)Awhererowmun=1;查询1020条记录select*from(selecta.*,rownumrnfrom(select*froms_emp)a)wherernbetween10and20;From,where后面可以跟子查询:SELECTfirst_name,salaryFROMs_empt1,(SELECTdept_id,AVG(salary)avgsalaryFROMs_em
37、pgroupbydept_id)t2WHEREt1.dept_id=t2.dept_idANDt1.salaryt2.avgsalary;rownum:对于一个查询返回的每一行,rownum伪列返回一个数值代表的次序。rownum伪列特点:1)要么等于1要么小于某个值,不能直接等于某个值,不能大于某个值2)常用于分页显示返回的第一行的rownum值为1,第二行的rownum值为2,依此类推。通过使用rownum伪列,用户可以限制查询返回的行数如:select*froms_empwhererownum引用完整性约束2、FK(ForeignKey外键约束)至少存在两张表把外键所在的表称子表,其引用
38、的表称为父表,外键的一些规范约束,是在子表中设置外键,一定是与父表的主键对应先建父表,后建子表先删子表,再删父表3、UK(UniqueKey唯一约束)唯一可以为空4、notnull非空约束所谓的约束是指在建表的时候对字段设置,当插入(insert)数据时会根据约束对插入的数据进行检查,例如某一字段为notnull,若插入该字段的记录(数据)是一个null值,就会报擦插入数据错误。把ER图关系模式转化成表关系:一对多多的那边做外键多对多用中间表把两个表连起来,学生表-课程表是多对多关系,需要建立一个中间表,学生选课表,这个包含两个表的主键做为它的自己的联合主键一对一外键加个唯一约束范式第一范式(
39、1NF):在关系模式R中的每一种具体关系r中,如果每个属性值都是不可再分的最小数据单位,则称R是第一范式的关系。第一范式简单的说就是要求属性具有原子性,不可以再分,第一范式面临的问题?引出第二范式第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字(可以使组合式的主键),则称关系R是属于第二范式。第二范式简单的说,就是每个表都有个主键,其他字段完全依赖于该主键,第二范式的问题?引出第三范式。第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字(即主键)都不存在传递依赖,则称关系R是属于第三范式。数据库定义语言a)数据库对象:Tabl
40、eViewIndexSequenceb)建表定义表的数据结构数据类型varchar(n)可变类型,按实际数据的长度存储char(n)定长,按定义的长度存储number(m,n)数值类型,可以定义宽度,也可以不定义宽度,默认缺省为38date日期类型,一定不能定义宽度char类型是一个固定长度的类型,会补空位;varchar和varchar2都是可变的,varchar是sql的标准,再别的数据库中都有,varchar2是oracle自身的标准。char类型最多的字符是4000个!建表的时候请注意字段与字段之间用“,”分割,最后一个字段不需要“,”标示,所谓字段如下的c1、c2等,数据是指数据表实
41、际存在的信息,可通过insert、update等实现数据信息持久createtablesunzw_test(-创建表c1varchar2(10),c2char(10),c3number(3),c4date);insertintosunzw_testvalues(sunzw,123,200,to_date(202211412:34:12,rrrrmmddhh24:mi:ss);-要注意数据格式和精确度createtablesunzw_test(c1varchar2(10)constraintssunzw_test_pk_c1primarykey,-把c1设为主键,列级约束c2char(10),c
42、3number(3),c4date);createtablesunzw_test(c1varchar2(10),c2char(10),c3number(3),c4date,constraintssunzw_test_pk_c1primarykey(c1)-表级约束);注意:定义联合主键时,只能用表级约束createtablesunzw_test(c1varchar2(10),c2char(10),c3number(3),c4date,constraintssunzw_test_pk_c1(约束名可有可无)primarykey(c1,c2);约束NOTNULL约束(这个字段不允许为空)creat
43、etablesunzw_test(c1numbernotnull,c2number);-为c1定义了非空约束NOTNULL约束只能定义为列级约束UNIQUE唯一约束createtablesunzw_test(c1numberprimarykey,c2numberunique);-为c2定义唯一约束唯一约束可以为空,唯一约束不考虑空值联合主键约束,这时只能用表级约束createtablesunzw_test(c1number,c2number,unique(c1,c2)-c1和c2联合唯一);PRIMARYKEY(主键约束)非空且唯一的定义createtablesunzw_test(c1numb
44、erprimarykey,c2number);createtablesunzw_test(c1numbernotnull,c2number,unique(c1);createtablesunzw_test(c1numberuniquenotnull,c2number);父表:createtablesunzw_parent(C1numberprimarykey,C2number);子表:createtablesunzw_child(C1numberprimarykey,C2numberreferencessunzw_parent(c1)-C2是parent表的外键);先建父表,再建子表错误ins
45、ertintosunzw_childvalues(1,1);-违反外键约束,因为父表中没有c1为1的记录让子表引用正确insertintosunzw_parentvalues(1,1);-先插父表insertintosunzw_childvalues(1,1);-后插子表注意:删除表时,要先删子表,再删父表droptablesunzw_child;droptablesunzw_parent;或者droptablesunzw_parentcascadeconstraints;级联约束,这样就删掉了父表和子表的FK约束表级约束定义格式createtablesunzw_child(C1numberp
46、rimarykey,C2number,foreignkey(c2)referencessunzw_parent(c1);级联删除约束createtablesunzw_child(C1numberprimarykey,C2numberreferencessunzw_parent(c1)ondeletecascade-级联删除,删除父表记录时,会级联把子表中的记录删除);C2是parent表的外键createtablesunzw_child(C1numberprimarykey,C2numberreferencessunzw_parent(c1)ondeletesetnull-级联删除,删除父表的
47、记录时,会把子表中引用字段变为null);CHECK检查约束(CK)定义一条件一约束字段列级定义:createtablesunzw_child(C1numberprimarykey,C2numbercheck(c2200);表级定义:createtablesunzw_child(C1numberprimarykey,C2numbernotnull,-同check(c2isnotnull)和非空的效果一样check(c2200);创建三张表学生表,课程表,选课表droptablesunzw_studentcascadeconstraints;droptablesunzw_coursecascadeconstraints;droptablesunzw_stu_curcascadeconstraints;createtablesunzw_student(sidnumber(10)primarykey,namevarchar2(10),agenumber(2),sexvarchar2(2),birthdaydate);createtablesunzw_course(cidnumber(10)primarykey,namevarchar2(5
限制150内