热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据库约束和视图问题

数据库约束和视图问题[sql]--约束--****************************************************************--非空约束:(notnull)*确保字段值不允许为空*与其他约束相比是唯一只能在字段级定义--在列级定义createtableEMPLOYEESNOTNULL(EMPLOYEE_

数据库约束和视图问题 [sql] --约束 --**************************************************************** --非空约束:(not null) * 确保字段值不允许为空 * 与其他约束相比是唯一只能在字段级定义 --在列级定义 create table EMPLOYEESNOTNULL ( EMPLOYEE_


数据库约束和视图问题

[sql]

--约束

--****************************************************************

--非空约束:(not null)

* 确保字段值不允许为空

* 与其他约束相比是唯一只能在字段级定义

--在列级定义

create table EMPLOYEESNOTNULL

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20) not null,--在列级定义

LAST_NAME VARCHAR2(25)

)

www.2cto.com

--在表的外部定义约束

create table EMPLOYEESNOTNULL_01

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25)

)

alter table EMPLOYEESNOTNULL_01

modify FIRST_NAME not null

--******************************************************************************************

--唯一性约束(UNIQUE)

* 唯一性约束条件确保所在的字段或者字段组合不出现重复值

* 唯一性约束条件的字段允许出现(1或多个)空值

* Oracle将为唯一性约束条件创建对应的唯一性索引

注:如果字段有值,要唯一,但空值可以出现多个

--方法一 在列级定义

create table emp_un_01

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20) unique, --列级定义

LAST_NAME VARCHAR2(25)

)

--方法二 在表级定义约束

--在表级定义约束额语法格式

constraint 约束的名称 约束的类型(字段1,字段2)

* 约束的名称 自定义

* 约束的类型(unique,primary key)

* (字段1,字段2) 如果有多个字段,中间用,隔开

create table emp_un_02

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25),

constraint un_emp_un_02 unique(first_name) --在表级定义约束

)

www.2cto.com

--方法三 在表的外部定义约束

--语法结构:

alter table table_name

add constraint 约束的名称 约束的类型(字段1,字段2)

* 约束的名称 自定义

* 约束的类型(unique,primary key)

* (字段1,字段2) 如果有多个字段,中间用,隔开

create table emp_un_03

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25)

)

alter table emp_un_03

add constraint un_emp_un_03 unique(first_name)

www.2cto.com

--方法四(在表级定义联合唯一)

create table emp_un_04

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25),

constraint un_emp_un_04 unique(first_name,LAST_NAME) --在表级定义约束

)

--方法五(在表的外部定义)

create table emp_un_05

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25)

)

www.2cto.com

alter table emp_un_05

add constraint un_emp_un_05 unique(first_name,LAST_NAME)

--******************************************************************************************

--主键约束( PRIMARY KEY)

* 主键从功能上看相当于非空且唯一

* 一个表中只允许一个主键

* 主键是表中能够唯一确定一个行数据的字段

* 主键字段可以是单字段或者是多字段的组合

* Oracle为主键创建对应的唯一性索引

--方法一 在列级定义

create table emp_pk_01

(

EMPLOYEE_ID NUMBER(6) primary key,

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25)

)

--方法二 在表级定义

create table emp_pk_02

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25),

constraint pk_emp_pk_02 primary key(EMPLOYEE_ID)

)

www.2cto.com

--方法三 在外部定义

create table emp_pk_03

(

EMPLOYEE_ID NUMBER(6),

FIRST_NAME VARCHAR2(20),

LAST_NAME VARCHAR2(25)

)

alter table emp_pk_03

add constraint pk_emp_pk_03 primary key(EMPLOYEE_ID)

--方法四(联合主键) 在表级定义

--账号表

create table account_01

(

accounid varchar2(18) primary key, --账号

balance number(10,2) --余额

)

--存款信息表

create table inaccount_01

(

accounid varchar2(18), --账号

inbalance number(10,2), --存入金额

indate timestamp, --存款时间

constraint pk_inaccount_01 primary key(accounid,indate)

)

insert into inaccount_01(accounid,inbalance,indate) values('1111',12,sysdate);

insert into inaccount(accounid,inbalance,indate) values('1111',10,sysdate);

www.2cto.com

--方法五 ,在外部定义

create table account_02

(

accounid varchar2(18) primary key, --账号

balance number(10,2) --余额

)

--存款信息表

create table inaccount_02

(

accounid varchar2(18), --账号

inbalance number(10,2), --存入金额

indate timestamp --存款时间

)

alter table inaccount_02

add constraint pk_inaccount_02 primary key(accounid,indate)

--**********************************************************************************

--外键约束( FOREIGN KEY)

* 外键是构建于一个表的两个字段或者两个表的两个字段之间的关系

* 外键确保了相关的两个字段的关系:

* 子表外键列的值必须在主表参照列值的范围内,或者为空

* 主表主键值被子表参照时,主表记录不允许被删除

* 外键约束条件参照的是主表的一个或者多个字段的值,通常被外键参照的 是
主表的主键或者唯一键

--在表级定义外键约束语法格式

constraint 约束的名称 foreign key(外键字段) references 表(主键)

* 约束的名称 自定义

* 约束的类型(foreign key)

* references 表(主键) 参照表的字段 一般为主表的主键

www.2cto.com

--方法一 在表级定义

create table deptfk_01

(

DEPARTMENT_ID NUMBER(4) primary key,

DEPARTMENT_NAME VARCHAR2(30),

MANAGER_ID NUMBER(6),

LOCATION_ID NUMBER(4)

)

create table EMPFK_01

(

EMPLOYEE_ID NUMBER(6) ,

FIRST_NAME VARCHAR2(20),

DEPARTMENT_ID NUMBER(4),

constraint fk_EMPFK_01 foreign key(DEPARTMENT_ID) references deptfk_01
(DEPARTMENT_ID)

)

www.2cto.com

--方法二 在表的外部定义

--在外部定义外键约束的语法格式

alter table table_name

add constraint 约束的名称 foreign key(外键字段) references 表(主键)

* 约束的名称 自定义

* 约束的类型(foreign key)

* references 表(主键) 参照表的字段 一般为主表的主键

create table deptfk_02

(

DEPARTMENT_ID NUMBER(4) primary key,

DEPARTMENT_NAME VARCHAR2(30),

MANAGER_ID NUMBER(6),

LOCATION_ID NUMBER(4)

)

create table EMPFK_02

(

EMPLOYEE_ID NUMBER(6) ,

FIRST_NAME VARCHAR2(20),

DEPARTMENT_ID NUMBER(4)

)

alter table EMPFK_02

add constraint fk_EMPFK_02 foreign key(DEPARTMENT_ID) references deptfk_02
(DEPARTMENT_ID)

--方法三(主外键作用于一个表的两个字段)

create table emp_two

(

EMPLOYEE_ID NUMBER(6) primary key,

FIRST_NAME VARCHAR2(20),

MANAGER_ID NUMBER(6) --外键

)

www.2cto.com

alter table emp_two

add constraint fk_emp_two foreign key(MANAGER_ID) references emp_two
(EMPLOYEE_ID)

--************************************************************************************

--check约束

* Check约束条件是一种比较特殊的约束条件,通过check定义,

* 强制定义在字段上的每一记录都要满足check中定义的条件。

* 在check中定义检查的条件表达式,进入表中的数据必须符合check中设置的条件

create table empck

(

EMPLOYEE_ID NUMBER(6) primary key,

FIRST_NAME VARCHAR2(20),

SALARY NUMBER(8,2) -->6000

)

alter table empck

add constraint ck_empck check(salary>6000)

--************************************************************************************

www.2cto.com

--删除约束

* 删除约束条件对于表和数据不会产生影响

* 删除约束emp_manager_fk

ALTER TABLE employees

DROP CONSTRAINT emp_manager_fk;

--删除ck_empck

alter table empck

drop constraint ck_empck

-- www.2cto.com ******************************************************************

--约束的应用案例:

create table F_ADDRESS

(

address_id number(6) primary key,

province_name varchar2(20),

city_name varchar2(20),

district_name varchar2(20),

street_name varchar2(20),

street_nbr varchar2(20),

detail varchar2(20),

postcode varchar2(10)

)

www.2cto.com

create table f_cust

(

cust_id number(6) primary key,

cust_name varchar(50),

address_id number(6),

state varchar(10)

)

alter table f_cust

add constraint fk_f_cust foreign key(address_id) references F_ADDRESS
(address_id)

alter table f_cust

add constraint ck_f_cust check(state in('在用','作废'))

--定义约束f_cust中 cust_name唯一

alter table f_cust

add constraint un_f_cust unique(cust_name)

--删除约束

alter table f_cust

drop constraint un_f_cust

www.2cto.com

--**************************************************************************************

--视图: --为sql语句起的别名 给予表之上的一个查询语句

--语法:

--在CREATE VIEW语句后加入子查询.

CREATE [OR REPLACE] VIEW view_name

[(alias[, alias]...)]

AS subquery

[WITH READ ONLY];

create or replace view v_emp

as

select * from employees

--查询视图

select * from v_emp;

--视图的作用

--* select 语句比较复杂

--* select语句在开发的程序中可能多次使用

--* 在程序中直接使用视图 select * from v_emp

create or replace view v_emp

as

select "EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER",

"HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID",
"DEPARTMENT_ID" from employees

www.2cto.com

--描述视图的结构(命令行执行)

desc v_emp

describe v_emp

--创建复杂视图

create or replace view v_emp_dept

as

select d.department_name,min(salary) mins,max(salary) mass,avg(salary) avgs,
sum(salary) sums,count(salary) counts

from employees e,departments d

where e.department_id=d.department_id

group by d.department_name

--查询视图 www.2cto.com

select * from v_emp_dept

--通过视图插入数据到表中

create or replace view v_dept

as

select deptno,dname,loc from dept

--查询视图

select * from v_dept

--通过 v_dept视图插入数据到dept表中

insert into v_dept(deptno,dname,loc) values(89,'xxx','ss')

--通过设置WITH READ ONLY选项可以禁止对视图执行DML操作.

create or replace view v_dept

as

select deptno,dname,loc from dept

with read only

--删除视图 www.2cto.com

--删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.

DROP VIEW view_name;

--删除v_dept视图

drop view v_dept

-******************************************************************************************


推荐阅读
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
小龙2602902913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有