oracle中创建unique唯一约束(单列和多列)
oracle中的unique约束是用来保证表中的某一类,或者表中的某一类组合起来不重复的一种手段。我们在可以在创建表时或者创建好后通过修改表的方式来创建oracle中的unique约束。
下面是一些创建unique约束的例子:
create table unique_test
(id number,
fname varchar2(20),
lname varchar2(20),
address varchar2(100),
email varchar2(40),
constraint name_unique unique(fname,lname))
在这里我们建立了一个表unique_test,并将其中的fname和lname组合起来建立了一个唯一约束。
我们也还可以在表创建完成后手动的通过修改表的方式来增加约束,例如:
alter table unique_test
add constraint email_unique unique(email);
下面我们来往表里面插入数据,
insert i nto unique_test(id,fname,lname) values(1,’德华’,'刘’)
这一行可以正常的被插入
因为我们在建立表时曾把fname和lname联合起来作为一个约束,因为如果我们希望再次插入刘德华,
insert into unique_test(id,fname,lname) values(2,’德华’,'刘’)
是会出现如下错误的:
ORA-00001: 违反唯一约束条件 (https://www.sodocs.net/doc/b716069080.html,_UNIQUE)
但我们如果改为如下值:
insert in to unique_test(id,fname,lname) values(2,’学友’,'张’);
又可以正常插入了。
有些朋友可能会有疑问,我们不是为email也建立的一个唯一约束吗?为什么这两行数据都没有为email列赋值,也就是或两行的email列都是空值,而插入也成功了呢?
这是因为一个空值(null)的含义是该列当前的状态是不存在,他永远不可能会与另外一个空值相等。所以也就不存在违反唯一约束之说了。
一、名词解释 (1)SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 (2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 (3)缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 (4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 (5)Java池:Java Pool为Java命令的语法分析提供服务。 (6)PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。 二、分析与调整 (1)系统全局域: SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/3到1/2。 a.共享池Shared Pool: 查看共享池大小Sql代码 SQL>show parameter shared_pool_size 查看共享SQL区的使用率: Sql代码 select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache; --动态性能表 LIBRARY命中率应该在90%以上,否则需要增加共享池的大小。
Oracle 插入数据 插入数据就是将数据放置到已经创建的表中,Oracle 数据库是通过INSERT 语句来实现插入数据的。一般情况下,使用INSERT 语句可以一次插入一行数据。 与SELECT 语句相比,INSERT 语句的使用方式要简单的多。在INSERT 语句的使用方式中,最为常用的形式是在INSERT INTO 子句中指定添加数据的列,并在V ALUES 子句中为各个列提供一个值。 下面语句将向SCOTT 模式中的EMP 表添加一条记录: SQL> insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) 2 values(7995,'A TG','CLERK',7782,to_date('2007-9-23','yyyy-mm-dd'),1300,null,10); 已创建 1 行。。 在向表中所有列添加数据时,可以省略INSERT INTO 子句后的列表清单,使用这种方法时,必须根据表中定义的列的顺序,为所有的列提供数据,用户可以使用DESC 命令查看表中定义列的顺序。下面的INSERT 语句在向EMP 表添加记录时省略了列清单: SQL> desc emp SQL> insert into emp 2 values(7996,'LI','CLERK',7782,to_date('2006-5-12','yyyy-mm-dd'),1200,null,10); 已创建 1 行。 在插入操作过程中,用户也可以根据实际情况只为部分列提供数据,而省略某些列的数据。注意这些列必须允许空值、有默认值或系统可以自动成生值等。例如,在EMP 表中,除EMPNO 列不允许空值外,其他列都可以为空值。 如果某个列不允许NULL 值存在,而用户没有为该列提供数据,则会因为违反相应的约束而插入失败。事实上,在定义表的时候为了数据的完整性,经常会为表添加许多约束。例如,在EMP 表中为了保证表中每条记录的惟一性,在表的EMPNO 列上定义了主键约束。如果用户试图为表中的EMPNO 列添加一个重复值,则因为违反主键约束而失败: SQL> insert into emp(empno,ename,job) 2 values(7782,'KING','CLERK'); insert into emp(empno,ename,job) * 第 1 行出现错误: ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP) 注 意 使用这种方法插入数据时有一个大隐患,如果为表指定的数值位置不对, 并且指定的数据类型之间可以转化,则执行该语句时系统不会返回任何错误信息。但是这会为该表添加一条错误的记录。由于这种错误难以发现,所以在添 加记录时最好在INSERT INTO 子句中指定列清单,以明确接收数据的列。
oracle 数据库的 5 种约束类型 oracle 数据库数据表的 5 个约束类型: 1.主键约束 2.外键约束 3.唯一约束 4.检查约束 5. 非空约束 F 主键约束:用来唯一标示表中的一个列, 一个表中的主键约束只能有一个,但是可以在一个主键约束 中包含多个列,也称为联合约束。外键约束:用来约束两 个表中列之间的关系。唯一约束:用来唯一标示表中的 列。与主键约束不同的是,在一个数据表中可以有多个唯一约束。检查约束:用来约束表中列的输入值得范围,比如 在输入性别时,要求数据库中只能输入男或者女,就可以使用检查约束来约束该列。非空约束:约束该列一定要输入值。 ----- 创建一个带检查约束的表:使用PL/SQL 语句创建检查约束的语法如下所示:CONSTRAINT constraint_name CHECK(condition) [ 语法说明:] CONSTRAINT: 关键词constraint_name: 约束名称condition: 约束条件列如:创建BOOKINFO 表时,给图书 价格加上一个检查约束,要求图书价格在10 元到100 元之间。CREATE TABLE BOOKINFO ( BOOKID
INT, BOOKNAME CAHR, PUBLISH
char, publish varchar2(20), pubdate varchar2(20), CHECK(PRICE>=10 AND PRICE ----- 创建一个带非空约束的表: 举例 :在创建 BOOKINFO 表时,给图书名称加上一个非空约束。 CREATE TABLE BOOKINFO ( BOOKID INT NOT NULL, BOOKNAME CHAR NOT NULL, PUBLISH PUBDATE VARCHAR2(20), AUTHOR CHAR, STORE ----- 创建一个带唯一约束的表 语法格式: CONSTRAINT constraint_name UNIQUE(column_name) 【语法说明】 UNIQUE: 唯一约束的关键词 column_name: 唯一约束的名称。 举例 :创建 BOOKINFO 表时,为图书名称( BOOKNAME )列添加唯一约束 create table bookinfo ( bookid int, bookname PRICE DECIMAL, AUTHOR CHAR, STORE VARCHAR2(1), READER INT, REMARKS VARCHAR2(50), CONSTRAINT CK_PRICE ); VARCHAR2(20), PRICE DECIMAL, VARCHAR2(1), VARCHAR2(50) READER INT, REMAERKS );
A. DECLARE ? B. SET ? C. UPDATE ? D. SELECT o 2. 能计算出一列中所有数的总和的函数是_____。【2.0分】 ? A. COUNT ? B. SUM ? C. AVG ? D. SQRT o 3. ORACLE中,用来判断列值是否为空的操作符是_____。【2.0分】? A. = NULL ? B. IS NULL ?
C. AS NULL ? D. NULLIS o 4. 分析以下SQL 命令: SELECT price FROM inventory WHERE price BETWEEN 1 AND 50 AND (price IN(55, 30, 95); 命令执行后的最可能的输出结果是_____。【2.0分】 ? A. 55 ? B. 30 ? C. 95 ? D. 51 o 5. Oracle中,当需要使用显式游标更新游标中的行时,声明游标时指定的SELECT语句必须带有_____子句。【2.0分】 ? A. WHERE CURRENT OF ? B. INTO ? C. FOR UPDATE ? D. ORDER BY
o 6. 当执行SELECT INTO语句没有返回行时,会触发_______异常。【2.0分】? A. TOO_MANY_ROWS ? B. NO_DATA_FOUND ? C. VALUE_ERROR ? D. 不会触发任何异常 o7. 下面哪一个like命令会返回名字像HOTKA的行?【2.0分】 ? A. where ename like …_HOT%' ? B. where ename like …H_T%' ? C. where ename like …%TKA_' ? D. where ename like …%TOK%' o8. 以下运算结果不为空值的是______。【2.0分】 ? A. 12+NULL ? B. 60*NULL ?
-- 数据准备:创建工资等级表 CREATE TABLE salgrade_test ( grade NUMBER (2), lowsal NUMBER (7, 2), hisal NUMBER (7, 2) ); -- 查看工资等级表结构 DESC salgrade; -- 查看工资等级表数据 SELECT * FROM salgrade_test; -- 插入数据 INSERT INTO salgrade_test VALUES (1, 10001, 99999); INSERT INTO salgrade_test VALUES (2, 8001, 10000); INSERT INTO salgrade_test VALUES (3, 6001, 8000); INSERT INTO salgrade_test VALUES (4, 4001, 6000); INSERT INTO salgrade_test VALUES (5, 1, 4000); -- 计算员工的薪水等级 SELECT NAME, salary, grade FROM emp_test, salgrade_test WHERE emp_test.salary BETWEEN salgrade_test.lowsal AND salgrade_test.hisal; -- ------------------------------------------------------SELECT NAME, salary, grade FROM emp_test
FULL JOIN salgrade_test ON emp_test.salary BETWEEN salgrade_test.lowsal AND salgrade_test.hisal; -- 复制表:只复制结构 , 不复制数据 CREATE TABLE salgrade_copy AS ( SELECT * FROM salgrade_test WHERE 1 <> 1 ); SELECT * FROM salgrade_copy; -- 复制表:复制一部分数据----通过设置别名的方式 , 指定新表中的列名(year_sal) CREATE TABLE emp_test_copy AS ( SELECT emp_id, NAME, salary * 12 year_sal FROM emp_test WHERE dept_test_id = 10 ); SELECT * FROM emp_test_copy; -- 复制表:复制一部分数据 -- 新表中的列名 CREATE TABLE emp_count (did, emp_num) AS ( SELECT dept_test_id, COUNT (*) FROM emp_test GROUP BY dept_test_id ); SELECT * FROM emp_count; -- 创建一个同 emp 表结构相同的空表 , 将部门号为 10 的员工信息放入该表 -- 如果有一张表 emp 的数据量为一百万条 , 此时需要建立 1 张测试表只放入少量测试数据( 如 100条 ) , 执行步骤如下所示: -- 第 1 步创建一个空表 CREATE TABLE emp_copy AS (
Oracle数据库实例及其相关概念2010-11-24 00:00 出处:中国IT实验室作者:佚名 完整的Oracle数据库通常由两部分组成:Oracle数据库实例和数据库。 用数据库安全策略防止权限升级攻击 C++虚函数的显式声明 完整的Oracle数据库通常由两部分组成:Oracle数据库实例和数据库。 1)数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等); 2)Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。 在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。Oracle有一个很大的内存快,成为全局区(SGA)。 一、数据库、表空间、数据文件 1.数据库 数据库是数据集合。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。 通常情况了我们称的“数据库”,并不仅指物理的数据集合,他包含物理数据、数据库管理系统。也即物理数据、内存、操作系统进程的组合体。 数据库的数据存储在表中。数据的关系由列来定义,即通常我们讲的字段,每个列都有一个列名。数据以行(我们通常称为记录)的方式存储在表中。表之间可以相互关联。以上就是关系模型数据库的一个最简单的描述。
当然,Oracle也是提供对面象对象型的结构数据库的最强大支持,对象既可以与其它对象建立关系,也可以包含其它对象。关于OO型数据库,以后利用专门的篇幅来讨论。一般情况下我们的讨论都基于关系模型。 2.表空间、文件 无论关系结构还是OO结构,Oracle数据库都将其数据存储在文件中。数据库结构提供对数据文件的逻辑映射,允许不同类型的数据分开存储。这些逻辑划分称作表空间。 表空间(tablespace)是数据库的逻辑划分,每个数据库至少有一个表空间(称作SYSTEM表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如:USER表空间供一般用户使用,RBS表空间供回滚段使用。一个表空间只能属于一个数据库。 每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。在Oracle7.2以后,数据文件创建可以改变大小。创建新的表空间需要创建新的数据文件。数据文件一旦加入到表空间中,就不能从这个表空间中移走,也不能与其它表空间发生联系。 如果数据库存储在多个表空间中,可以将它们各自的数据文件存放在不同磁盘上来对其进行物理分割。在规划和协调数据库I/O请求的方法中,上述的数据分割是一种很重要的方法。 3.Oracle数据库的存储结构分为逻辑存储结构和物理存储结构: 1)逻辑存储结构:用于描述Oracle内部组织和管理数据的方式; 2)物理存储结构:用于描述Oracle外部即操作系统中组织和管理数据的方式。 二、Oracle数据库实例
oracle ALTER 用法 1.如果sql语句中有''(单引号或者双引号)括的字符串,则需要同表中严格一致,不然会显示“找 不到行”这个错误。 alter语句的用法 需要修改结构的,就用到alter语句,方法如下: 1.ALTER TABLE语句用于修改已经存在的表的设计。 2.语法: ALTER TABLE table ADD COLUMN field type[(size)] [NOT NULL] [CONSTRAINT index ] 3.ALTER TABLE table ADD CONSTRAINT multifieldindex 4.ALTER TABLE table DROP COLUMN field 5.ALTER TABLE table DROP CONSTRAINT indexname 6. 7.说明:table参数用于指定要修改的表的名称。 8.ADD COLUMN为SQL的保留字,使用它将向表中添加字段。 9.ADD CONSTRAINT为SQL的保留字,使用它将向表中添加索引。 10.DROP COLUMN为SQL的保留字,使用它将向表中删除字段。 11.DROP CONSTRAINT为SQL的保留字,使用它将向表中删除索引。 12.field指定要添加或删除的字段的名称。 13.type参数指定新建字段的数据类型。 14.size参数用于指定文本或二进制字段的长度。 15.indexname参数指定要删除的多重字段索引的名称。 16. 17.用sql*plus或第三方可以运行sql语句的程序登录数据库: 18. 19.ALTER TABLE (表名) ADD (列名数据类型); 20.ALTER TABLE (表名) MODIFY (列名数据类型); 21.ALTER TABLE (表名) RENAME COLUMN (当前列名) TO (新列名); /////不需要括号 22.ALTER TABLE (表名) DROP COLUMN (列名); 23.ALTER TABLE (当前表名) RENAME TO (新表名); 24. 25.如: 26.Alter Table Employ Add (weight Number(38,0)) ; 27. 28.Alter Table Employ Modify (weight Number(13,2)) ; 29. 30.Alter Table Emp Rename Cloumn weight To weight_new ; 31. ALTER TABLE emp DROP COLUMN weight_new ;
建表(一对多)代码及相关约束 create table t_class( c_id number(3) primary key, c_name varchar2(20) not null ); create table t_stu( s_id number(5) primary key, s_name varchar2(8) not null, sex char(2) default '男', birthday date, school_age number(2) check(school_age>0), school_score number(5,2), c_id number(3), id_card char(18) unique, foreign key(c_id) references t_class(c_id) ); 附:测试数据: insert into t_class values(1,'订单班'); insert into t_class values(2,'开发班'); insert into t_class values(3,'美工班'); insert into T_STU (S_ID, S_NAME, SEX, BIRTHDAY, SCHOOL_AGE, SCHOOL_SCORE, C_ID, ID_CARD) values (1, 'a', '男', to_date('01-01-1980', 'dd-mm-yyyy'), 24, 90, 1, null); insert into T_STU (S_ID, S_NAME, SEX, BIRTHDAY, SCHOOL_AGE, SCHOOL_SCORE, C_ID, ID_CARD) values (2, 'b', '男', to_date('11-05-1981', 'dd-mm-yyyy'), 23, 80, 1, null); insert into T_STU (S_ID, S_NAME, SEX, BIRTHDAY, SCHOOL_AGE, SCHOOL_SCORE, C_ID, ID_CARD) values (3, 'c', '女', to_date('19-09-1982', 'dd-mm-yyyy'), 22, 50, 1, null); insert into T_STU (S_ID, S_NAME, SEX, BIRTHDAY, SCHOOL_AGE, SCHOOL_SCORE, C_ID, ID_CARD) values (4, 'd', '女', to_date('28-01-1984', 'dd-mm-yyyy'), 21, 80, 2, null); insert into T_STU (S_ID, S_NAME, SEX, BIRTHDAY, SCHOOL_AGE, SCHOOL_SCORE, C_ID, ID_CARD)
Oracle 内存内存全面全面全面分析分析 作者作者::fuyuncat 来源来源::https://www.sodocs.net/doc/b716069080.html, 作者简介 黄玮,男,99年开始从事DBA 工作,有多年的水利、军工、电信及航 运行业大型数据库Oracle 开发、设计和维护经验。 曾供职于南方某著名电信设备制造商——H 公司。期间,作为DB 组 长,负责设计、开发和维护彩铃业务的数据库系统。目前,H 公司的彩铃系 统是世界上终端用户最多的彩铃系统。最终用户数过亿。 目前供职于某世界著名物流公司,负责公司的电子物流系统的数据库开 发、维护工作。 msn: fuyuncat@https://www.sodocs.net/doc/b716069080.html, Email :fuyuncat@https://www.sodocs.net/doc/b716069080.html, Oracle 的内存配置与oracle 性能息息相关。而且关于内存的错误(如4030、4031错 误)都是十分令人头疼的问题。可以说,关于内存的配置,是最影响Oracle 性能的配 置。内存还直接影响到其他两个重要资源的消耗:CPU 和IO。 首先,看看Oracle 内存存储的主要内容是什么: ? 程序代码(PLSQL、Java); ? 关于已经连接的会话的信息,包括当前所有活动和非活动会话; ? 程序运行时必须的相关信息,例如查询计划; ? Oracle 进程之间共享的信息和相互交流的信息,例如锁; ? 那些被永久存储在外围存储介质上,被cache 在内存中的数据(如redo log 条 目,数据块)。 此外,需要记住的一点是,Oracle 的内存是与实例对应的。也就是说,一个实例就有 一个独立的内存结构。 先从Oracle 内存的组成架构介绍。 1. Oracle 的内存架构组成 Oracle 的内存,从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享 部分(主要是PGA 和UGA)。而这两部分内存里面,根据功能不同,还分为不同内存池 (Pool)和内存区(Area)。下面就是Oracle 内存构成框架图:
一、选择题 1. Oracle数据表中,下面哪个可以作为有效的列名( A )(选择一项) A. class B. 123_NUM C. date D. #123_NUM 2. Oracle中的三种系统文件分别是( ABC )〔选择三项〕 A. 数据文件 DBF B. 控制文件 CTL C. 日志文件 LOG D. 归档文件 ARC 3.下面哪个命令可以用来查看学生表(表名student)的表结构( C )〔选择一项〕 A. Select student ; B. Display student ; C. Describe student ; D. Show student ;。 4.下面哪个命令不属于数据定义语言(DDL)( D )(选择一项) A. alter table… B、drop index… C、create view… D、update tablename… 5.在设计数据库时,要充分考虑数据的完整性或准确性。下面关于primary key和unique的描述错误的是()〔选择一项) A. primary key用来在表中设置主键,主键列的值是不能重复的,用来唯一标识表中的每一条记录 B. 设为unique的列的值是不能重复的,用来唯一区别unique列的值 C. primary key列不可以有null值, 而unique列是可以有null的 D. primary key列和unique列都不可以有null值 6.假定有一张表员工表employee,其中一性别字段sex,该列只能存入'男'或'女'。为了维护数据的完整性,在设计数据库时,最好对sex字段添加约束,请问应该添加什么约束( B )(选择一项) A. primary key B、check C、default D、unique 7.为表TEST中ID列添加主键约束的语法是( D )〔选择一项〕 A. ALTER TABLE TEST CHANGE( ID INT PRIMARY KEY) B. ALTER TABLE TEST ADD( ID INT PRIMARY KEY)
一、名词解释 (1)SGA:SystemGlobal Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。 (2)共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,主要包括:Librarycache(共享SQL区)和Datadictionarycache(数据字典缓冲区)。共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息。 (3)缓冲区高速缓存:DatabaseBufferCache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能。 (4)大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境。 (5)Java池:Java Pool为Java命令的语法分析提供服务。 (6)PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。 二、分析与调整 (1)系统全局域: SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/3到1/2。 a.共享池Shared Pool: 查看共享池大小Sql代码 SQL>show parameter shared_pool_size 查看共享SQL区的使用率: Sql代码 select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache; --动态性能表 LIBRARY命中率应该在90%以上,否则需要增加共享池的大小。 查看数据字典缓冲区的使用率:
Oracle 插入数据 插入数据就是将数据放置到已经创建的表中,Oracle 数据库是通过INSERT 语句来实现插入数据的。一般情况下,使用INSERT 语句可以一次插入一行数据。 与SELECT 语句相比,INSERT 语句的使用方式要简单的多。在INSERT 语句的使用方式中,最为常用的形式是在INSERT INTO 子句中指定添加数据的列,并在V ALUES 子句中为各个列提供一个值。 下面语句将向SCOTT 模式中的EMP 表添加一条记录: SQL> insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) 2 values(7995,'A TG','CLERK',7782,to_date('2007-9-23','yyyy-mm-dd'),1300,null,10); 已创建 1 行。。 在向表中所有列添加数据时,可以省略INSERT INTO 子句后的列表清单,使用这种方法时,必须根据表中定义的列的顺序,为所有的列提供数据,用户可以使用DESC 命令查看表中定义列的顺序。下面的INSERT 语句在向EMP 表添加记录时省略了列清单: SQL> desc emp SQL> insert into emp 2 values(7996,'LI','CLERK',7782,to_date('2006-5-12','yyyy-mm-dd'),1200,null,10); 已创建 1 行。 在插入操作过程中,用户也可以根据实际情况只为部分列提供数据,而省略某些列的数据。注意这些列必须允许空值、有默认值或系统可以自动成生值等。例如,在EMP 表中,除EMPNO 列不允许空值外,其他列都可以为空值。 如果某个列不允许NULL 值存在,而用户没有为该列提供数据,则会因为违反相应的约束而插入失败。事实上,在定义表的时候为了数据的完整性,经常会为表添加许多约束。例如,在EMP 表中为了保证表中每条记录的惟一性,在表的EMPNO 列上定义了主键约束。如果用户试图为表中的EMPNO 列添加一个重复值,则因为违反主键约束而失败: SQL> insert into emp(empno,ename,job) 2 values(7782,'KING','CLERK'); insert into emp(empno,ename,job) * 第 1 行出现错误: ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP) 关于为表定义完整性约束,将在后面的章节中介绍,这里需要记住的是在向表添加记录时,添加的数据必须符合为表定义的所有完整性约束。 INSERT 语句还有一种用法,可以实现一次向表中添加一组数据。即使用SELECT 语句替换V ALUES 子句,这样由SELECT 语句提供添加的数值。例如,下面的示例从EMP 表提注 意 使用这种方法插入数据时有一个大隐患,如果为表指定的数值位置不对, 并且指定的数据类型之间可以转化,则执行该语句时系统不会返回任何错误信 息。但是这会为该表添加一条错误的记录。由于这种错误难以发现,所以在添加记录时最好在INSERT INTO 子句中指定列清单,以明确接收数据的列。
练习作业 创建表emp1,字段如下 eno char(3), ename char(6) sex char(2) age number(2) dno char(3) 并插入如下数据 1 ,TOM ,男,21 ,’001’ 2 ,JERRY ,男,21 ,’002’ 3 ,KATE ,女,21 ,’003’ 4 ,MARY ,女,21 ,’004’ 5 ,JACK ,男,21 ,’005’ i.在eno字段上创建主键约束 ii.在ename字段上创建非空约束 iii.创建检查约束判断age在18到60岁之间的男性或者age在18到55岁之间的女性iv.在dno字段上创建唯一性约束 create table emp1( eno char(3) primary key, ename char(6) not null, sex char(2), age number(2), dno char(3) unique, constraint sex_age check( ((age between18and60) and sex='男') or ((age between18and55) and sex='女')) ) insert into emp1 values('1','TOM','男',21,'001') insert into emp1 values('2','JERRY','男',21,'002');
insert into emp1 values('3','KATE','女',21,'003'); insert into emp1 values('4','MARY','女',21,'004'); insert into emp1 values('5','JACK','男',21,'005'); v.创建和emp1表字段相同的emp_bak表,将emp_bak表的eno字段与emp表的eno字段创建外键约束 create table emp_bak as select * from emp1 where1=2 alter table emp_bak add constraint v foreign key(eno) references emp1(eno); 1、请创建一个表,表名为phone,表结构如下 电话号码(PHONENUM VARCHAR2(8)) 电话费(PAY number(8,2)) 号码等级(NUMLEVEL VARCHAR2(4)) 费用日期(PAYDATE varchar2(12) create table phone ( phonenum varchar2(8), pay number(8,2), numlevel varchar2(4), paydate varchar2(12) ) 1)插入以下两条数据. 123456, 600, pt04, 20051220 888888, 900, pt05, 20051019. insert into phone values('123456',600,'pt04', '20051220'); insert into phone values('888888',900,'pt05', '20050919');
Oracle 非空约束 非空约束就是限制必须为某个列提供值。空值是不存在的,它即不是数字0,也不是空字符串,而是没有、未知。 在表中,当某些字段的值是不缺少的,那么就可以为该列定义为非空约束。这样当插入数据时,如果没有为该列提供数据,那么系统就会出现一个错误消息。 如果某些列的值是可有可无的,那么可以定义这些列允许空值。这样,在插入数据时,就可以不向该列提供具体的数据。在默认情况下,表中的列是允许空值的。 例如,在创建EMPLOYEES表时,规定EMPNO、ENAME和DEPTNO列不能为空值:SQL> create table employees( 2 empno number(10) not null, 3 ename varchar2(20) not null, 4 sex char(2), 5 salary number(8,2), 6 hiredate date default sysdate, 7 job varchar2(10), 8 email varchar2(50), 9 deptno number(3) not null); 表已创建。 也可以使用ALTER TABLE MODIFY语句为已经创建的表删除或重新定义NOT NULL 约束。例如,下面的语句为SALARY字段定义了非空约束: SQL> alter table employees 2 modify salary not null; 表已更改。 在为表中的字段定义了非空约束后,当用户向表插入数据时,如果未向对应的字段提供值,则添加数据操作将返回一个如下所示的错误: SQL> insert into employees(ename,sex,salary,deptno) 2 values('刘丽','男',1500,20); insert into employees(ename,sex,salary,deptno) * 第 1 行出现错误: ORA-01400: 无法将NULL 插入("SCOTT"."EMPLOYEES"."EMPNO") 如果使用ALTER TABLE … MODIFY为表添加NOT NULL约束,并且表中该列的数据已经存在NULL值,则向该列添加NOT NULL约束将失败。这是因为当为该列应用非空约束时,Oracle将会试图检查表中的所有的行,以验证所有行在对应的列是否存在NULL值。 使用ALTER TABLE … MODIFY语句还可以删除表中非空约束。例如,下面的语句删除了SALARY列的非空约束: SQL> alter table employees 2 modify salary null;
Oracle 内存分配与调整 一、前言 对于oracle 的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。下面我们将一步一步就内存管理的各个方面进行探讨。 二、概述 oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是SGA 和PGA(process global area or private global area 。对于SGA 区域内的内存来说,是共享的全局的,在UNIX 上,必须为oracle 设置共享内存段(可以是一个或者多个,因为oracle 在UNIX 上是多进程;而在WINDOWS 上oracle 是单进程(多个线程,所以不用设置共享内存段。PGA 是属于进程(线程私有的区域。在oracle 使用共享服务器模式下(MTS,PGA 中的一部分,也就是UGA 会被放入共享内存 large_pool_size 中。对于SGA 部分,我们通过sqlplus 中查询可以看到: SQL> select * from v$sga; NAME V ALUE Fixed Size 454032 Variable Size 109051904 Database Buffers 385875968 Redo Buffers 667648 其中: Fixed Size:
oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA 各部分组件的信息,可以看作引导建立SGA 的区域。Variable Size: 包含了shared_pool_size 、java_pool_size 、large_pool_size 等内存设置Database Buffers: 指数据缓冲区,在8i 中包含db_block_buffer*db_block_size 、 buffer_pool_keep 、buffer_pool_recycle 三部分内存。在9i 中包含db_cache_size 、 db_keep_cache_size 、db_recycle_cache_size 、db_nk_cache_size 。 Redo Buffers: 指日志缓冲区,log_buffer 。在这里要额外说明一点的是,对于v$parameter 、 v$sgastat 、v$sga 查询值可能不一样。v$parameter 里面的值,是指用户在初始化参 数文件里面设置的值,v$sgastat 是oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以block 为最小单位进行分配的, v$sga 里面查询的值,是在oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小大约是11k(不同环境可能不一样。参考如下内容 SQL> select substr(name,1,10 name,substr(value,1,10 value 2 from v$parameter where name = 'log_buffer'; NAME V ALUE log_buffer 524288 SQL> select * from v$sgastat ; POOL NAME BYTES fixed_sga 454032
Oracle 外键约束 外键FOREIGN KEY约束是几种约束是最复杂的,外键约束可以使两个表进行关联。外键是指引用另一个表中的某个列或某几个列,或者本表中另一个列或另几个列的列。被引用的列应该具有主键约束,或者惟一性约束。 在外键的定义中,涉及到外键表、外键列、被引用表和被引用列等几个概念。如果成功地创建了外键约束,那么系统将要求外键列中的数据必须来自被引用列中的数据。被引用列中不存在的数据不能存储于外键列中。在一般情况下,当删除被引用表中的数据时,该数据也不能出现在外键列中。如果外键列存储了将要在被引用表中删除的数据,那么对被引用表删除数据的操作将失败。 最典型的外键约束是HR模式中的EMPLOYEES和DEPARTMENT表,在该外键约束中,外键表EMPLOYEES中的外键列DEMPARTMENT_ID将引用被引用表DEPARTMENTS 中的DEMPARTMENT_ID列。 例如,在以下的示例中,将以HR身份连接到数据库,并创建一个新表ADMINISTRATION_EMP,并为其添加到DEPATRMENT表的外键约束:SQL> connect hr/hr 已连接。 SQL> create table administration_emp 2 as select * from hr.employees 3 where department_id=10; 表已创建。 SQL> alter table administration_emp 2 add constraint admin_dep_fk 3 foreign key(department_id) 4 references departments(department_id); 表已更改。 为验证创建的外键约束的有效性,可以向ADMINISTRATION_EMP表添加一条记录,并且它的DEPARTMENT_ID列值不存在DEPARTMENTS表中,那么插入操作将会因为违反外键约束而失败: SQL> insert into administration_emp( 2 employee_id,last_name,email,hire_date,job_id,department_id) 3 values(120,'刘丽','li@https://www.sodocs.net/doc/b716069080.html,',sysdate,'HR_REP',360); insert into administration_emp( * 第 1 行出现错误: ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字 注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。
? 对主要的数据库对象进行分类 ? 查看表结构 ? 列举列可以使用的数据类型 ? 创建简单的表 ? 说明创建表时如何创建约束条件 ? 描述方案对象如何工作 ? 数据库对象 –命名规则 ? CREATE TABLE语句: –访问另一个用户的表 – DEFAULT选项 ? 数据类型 ? 约束条件概览:NOT NULL、UNIQUE、PRIMARY KEY、 FOREIGN KEY、CHECK约束条件 ? 使用子查询创建表 ? ALTER TABLE –只读表 ? DROP TABLE语句 数据库对象 Oracle DB 可以包含多种数据结构。在数据库设计中应对每种结构加以概述,以便可在数据库开发的构建阶段创建数据库结构。 ? 表:用于存储数据 ? 视图:一个或多个表中数据的子集
? 序列:用于生成数字值 ? 索引:提高某些查询的性能 ? 同义词:给出对象的替代名称 Oracle 表结构 ? 在任何时候都可以创建表,即使用户正在使用数据库时也是如此。 ? 无需指定表的大小。表的大小最终由全部分配给数据库的空间量确定。但是,需要估计一个表将要使用的空间大小,这一点非常重要。 ? 可以联机修改表结构。 ?命名规则 表名和列名必须满足以下条件: ? 以字母开头 ? 长度为1-30 个字符 ? 只包含A-Z、a-z、0-9、_、$ 和# ? 不与同一用户拥有的其它对象重名 ? 不是Oracle Server 的保留字 应根据命名任意Oracle DB 对象的标准规则来命名数据库表和列: ? 表名和列名必须以字母开头,长度必须为1-30 个字符。 ? 名称中只能包含字符A-Z、a-z、0-9、_(下划线)、$ 和#(这两个字符是合法字符,但建议不要使用它们)。 ? 不能与同一Oracle Server 用户拥有的其它对象重名。 ? 不能是Oracle Server 的保留字。 - 还可以使用加引号的标识符来表示对象名称。加引号的标识符以双引号(“”) 开始和结束。如果使用加双引号的标识符为方案命名,那么,只要引用该对象,就必 须使用双引号。加引号的标识符可以是保留字,不过建议不要这样做。 命名准则 对于表和其它数据库对象,应使用描述性名称。 注:名称不区分大小写,例如,EMPLOYEES与eMPloyees或eMpLOYEES被认为是同一名称。但是,加引号的标识符区分大小写。 ?CREA TE TABLE语句