搜档网
当前位置:搜档网 › Oracle 外键约束

Oracle 外键约束

Oracle  外键约束
Oracle  外键约束

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/3710150160.html,',sysdate,'HR_REP',360);

insert into administration_emp(

*

第 1 行出现错误:

ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字

注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。

Oracle__插入数据

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 种约束类型 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 );

oracle题1

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 ?

经典SQL语句大全_主外键_约束

一、基础(建表、建约束、关系) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。 (最后几页介绍SQL基础约束) 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) --建表、建约束、关系 create table tableok ( col1 int, col2_notnull int not null, col3_default nchar(1) not null default('男'), --默认男 col4_default datetime not null default(getdate()), --默认得到系统时间 col5_check int not null check(col5_check>=18 and col5_check<= 55),--添加约束,数据值在18到55之间 col6_check nchar(9) not null check(col6_check like 'msd0902[0-9][^ 6-9]'), --添加约束,数据值前7位必须是‘msd0902’,倒数第两位可以是0-9中任意一个数字,最后一位不是6-9之间的数字。 cola_primary nchar(5) not null primary key, --建立主键 colb_unique int unique, --唯一约束 col7_Identity int not null identity(100,1), --自增长,从100开始,每列值增加1个

oracle ALTER 用法

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 ;

Oracle 建表(一对多)代码及相关约束示例

建表(一对多)代码及相关约束 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)

外键约束

主-外键约束(FOREIGN KEY) 之前所讲的约束都是针对一张表的约束,那么主-外键约束是针对于两张表的约束。为什么需要主-外键约束? 前面已经创建了一个person表,book表中的pid对应person表中的pid。表示该本图书是属于哪个人的。 向book表中插入一行pid为00000000000000000的记录。 很明显,编号为00000000000000000的记录根本不存在,那1002图片怎么可以属于一

个不存在的人呢?如果要想解决这样的问题,就需要使用主-外键约束。主-外键约束的好处是book.pid的取值必须在person.pid之内。 创建主-外键约束的语法: 再次向book表中插入记录。 测试:删除父表中已经与子表关联的记录。 首先向book表中插入合法数据。 删除person表中pid为’111111111111111111’的记录。

主-外键约束,可以保证两张表的数据完整性,不会出现找不到对应数据的情况。 主-外键约束的注意事项: ●子表的外键必须是主表的主键。例如:book.pid是相对与person.pid的外键。 那么person.pid必须是主键。 ●删除父表记录时,需要先删除子表中相关联的所有记录,然后才能删除父表中 的记录。例如:要删除person表中pid为111111111111111111的记录,需要 在删除book表中pid为111111111111111111的所有记录后,才能删除。 ●删除父表时,需要选删除子表,才能删除父表。例如:要删除person表,需要 在删除book表之后,才能删除。 可以使用CASCODE CONTRAINT强行删除父表。但强烈建议大家不要这么使用。 重新创建person表。

SQL的主键和外键的作用

SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识 一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学 生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证 号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如, A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用:

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)

外键约束(20171015)

外键约束 先要理清几个概念: 1)候选键(Candidate Key):关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的属性组称作候选键(候选码)。2)主键(Primary Key):当有多个候选键时,可以选定一个作为主键,选定的候选键称为主键(主码)。 主键唯一标识表中的每行记录。主键约束有如下特点:每个表中只能有一个主键,主键可以是一列,也可以是多列的组合;主键值必须唯一并且不能为空,对于多列组合的主键,某列值可以重复,但列的组合值必须唯一。 3)外键(Foreign Key):关系R中的一个属性组,它不是R的候选键,但它与另一个关系S 的候选键相对应,则称这个属性组为R的外键(外码)。关系R称为参照关系(参照表、从表),关系S称为被参照关系(被参照表、主表)。 外键是指一个表(从表)中的一列或列组合,它虽不是该表的主键,但却是另一个表(主表)的主键。通过外键约束可以为相关联的两个表建立联系,实现数据的引用完整性,维护两表之间数据的一致性关系。特殊情况下,参照关系和被参照关系可以是同一个关系。即,特殊情况下,从表和主表可以是同一个表。参照[引用]关系(Referencing Relation)、子表、从表、外键表、参照[引用]表,这些作为同一术语的同义词使用。 被参照[被引用]关系(Referenced Relation)、父表、主表、主键表、被参照[被引用]表、查找表,这些作为同一术语的同义词使用。 请注意,在英语国家讲数据库的英语文献中,relation有时指“表”,有时指两表之间的联系(relationship)。指两表之间的relationship时也常用link[链接]。 relationship和relation通常都翻译为关系,但在数据库中两者含义不同。relationship [关系;联系;关联],在数据库中指不同表之间的数据彼此联系的方法。数据库表之间的表之间的relationship有:一对一、一对多、多对多。relation[关系],在数据库指表,从本质上说,关系是一个包含行和列的二维表或数组。应根据语境区别理解。 例、有两个关系: student (s#, sname, d#),即学生这个关系有三个属性:学号,姓名,所在系别 department(d#, dname),即院系有两个属性:系号、系名 则s#、d#是各自所在关系的主键,d#还是关系student的外键。student是参照关系(从表),department是被参照关系(主表)。 建立外键约束(FOREIGN KEY)后,从表中的外键的取值,要么在主表有对应的值,要么为NULL,但不能是主表中没有对应的值。特殊情况下,从表和主表可以是同一个表。 通过外键能实现数据的参照完整性(Referential Integrity引用完整性),参照完整性约束意味着,从表中某列(外键列)和主表中的某列(主键或UNIQUE约束)匹配。这些列称为对应列(有时也称为公共字段)。 外键既能确保数据完整性,也能表现表之间的关系(relationship)。也就是说,如果你为引用表(从表)定义了外键,就在你定义外键的表(从表、引用表)和外键引用的表(主表、被引用表)之间既确保了数据完整性也确定了两表之间的关系。 ◇建立外键约束后,从表中的外键的取值,要么在主表有对应的值,要么为NULL,通过定义引用列(从表中的外键)为NOT NULL,可以确保外键的取值必须在主表有对应的值。 ☆建立参照完整性约束后的级联动作受{ON DELETE | ON UPDATE} { NO ACTION | CASCADE |

Oracle 插入数据

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 子句中指定列清单,以明确接收数据的列。

Oracle基础练习题及答案(表约束)

练习作业 创建表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');

外键约束 举例

(1)基本介绍 外键作用:使两张表形成关联,外键只能引用外表中的指定列的值! 建立外键的前提:本表的列必须与外键类型相同(外键必须是外表的主键)。 指定外键关键字:foreign key(列名) 引用外键关键字:references <外键表名>(外键列名) 事件触发限制: on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action 例如: outTable表主键id 类型int 创建含有外键的表: create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade); 说明:把id列设为外键参照外表outTable的id列当外键的值删除本表中对应的列筛除当外键的值改变本表中对应的列值改变。 (2)定义数据表 假如某个电脑生产商,它的数据库中保存着整机和配件的产品信息。用来保存整机产品信息的表叫做pc;用来保存配件供货信息的表叫做parts。 Pc表 在pc 表中有一个字段,用来描述这款电脑所使用的CPU型号; 在parts 表中相应有一个字段,描述的正是CPU的型号,我们可以把它想成是全部CPU的型号列表。 很显然,这个厂家生产的电脑,其使用的cpu 一定是供货信息表(parts)中存在的型号。这时,两个表中就存在一种约束关系(constraint)—— pc 表中的cpu 型号受到parts 表中型号的约束。 首先我们来创建parts 表: Create TABLE parts ( ... 字段定义..., model V ARCHAR(20) NOT NULL,

Oracle 非空约束

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;

SQL Server外键设置笔记

SQL的主键和外键约束 SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。 (4)更新主键记录时,同样有级联更新和拒绝执行的选择。 简而言之,SQL的主键和外键就是起约束作用。 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键; 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是一个主键; 成绩表(学号,课程号,成绩) 成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。 定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。 二、主键、外键和索引的区别 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键--用来保证数据完整性 外键--用来和其他表建立联系用的 索引--是提高查询排序的速度 个数: 主键--主键只能有一个 外键--一个表可以有多个外键 索引--一个表可以有多个唯一索引 创建SQL的主键和外键约束的方法: create table Student --建表格式:create table 自定义的表名 ( --字段名一般为有一定意义的英文 StudentName nvarchar(15), -- 格式:字段名类型()括号里面的是允许输入的长度StudentAge int, --int型的后面不需要接长度

Oracle 外键约束

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/3710150160.html,',sysdate,'HR_REP',360); insert into administration_emp( * 第 1 行出现错误: ORA-02291: 违反完整约束条件(HR.ADMIN_DEP_FK) - 未找到父项关键字 注意在一个表上创建外键约束时,被引用表必须已经存在,并且必须为该表的引用列定义惟一性约束或主键约束。

Oracle 禁止和激活约束

Oracle 禁止和激活约束 在默认情况下,约束创建之后就一直起作用。但是,也可以根据具体应用情况,临时禁用某个约束。当某个约束被禁用后,访约束就不再起作用了,但它还存在数据库中。 为什么要禁用约束呢?这是因为约束的存在会降低插入和更改数据的效率,系统必须确认这些数据是否满足定义的约束条件。当执行一些特殊操作时,如使用SQL*Loader从外部数据源向表中导入大量数据,并且事先知道操作的数据满足了定义的约束,为提高运行效率,就可以禁用这些约束。 但是,禁用约束只是一种暂时现象,某些在禁用约束状态下完成的操作完成之后,还应该激活约束。如果约束没有必要存在,则可以删除约束。 禁用约束即可以在定义约束时执行,也可以对现有的约束执行禁用操作。在使用CREATE TABLE或ALTER TABLE语句定义约束时,默认情况下约束是激活的。如果在定义约束时使用关键字DISABLE,则约束的是被禁用的。如果希望禁用已经存在的约束,则可以在ALTER TABLE语句中使用DISABLE CONSTRAINT子句。其语法形式如下:alter table table_name disable constraint constraint_name; 如果希望激活被禁用的约束,则可以在ALTER TABLE语句中使有ENABLE CONSTRAINT子句激活约束。激活约束的语法形式如下: alter table table_name enable [novalidate | validate] constraint constraint_name; 关键字NOV ALIDATE表示在激活约束时不验证表中已经存在的数据是否满足约束,如果没有使用该关键字,或者使用V ALIDATE关键字,则在激活约束时系统将要验证表中的数据是否满足约束的定义。 例如,下面的语句在创建EMPLOYEES表时将定义的约束置为禁用状态: create table employee_history( ... salary number(8,2) constraint emp_sal_ck check (salary>0) disable, ... ) 需要注意,在禁用主键约束时,Oracle默认会删除约束对应的惟一索引,而在重新激活约束时,Oracle将会为重新建立惟一索引。如果希望在删除约束时保留对应的惟一索引,可以在禁用约束时使用关键字KEEY INDEX。例如,下面的语句在禁用主键约束时保留在相应的索引: alter table employees disable constraint emp_pk keep index; 在禁用惟一性约束或主键约束时,如果有外键约束正在引用该列,则无法禁用惟一性约束或主键约束。这时可以先禁用外键约束,然后再禁用惟一性约束或主键约束;或者在禁用惟一性约束或主键约束时使用CASCADE关键字,这样可以级联禁用引用这些列的外键约束。 例如,在下面的示例中,将禁用EMPLOYEES表的EMP_PK主键约束,然后再重新激活该约束。 (1)以SCOTT身份连接数据库系统。

相关主题