Oracle数据库对象---你diss了嘛

2023-11-07

1.数据库对象
2.同义词
3.序列
4.视图
5.索引


Oracle中比较有特色的:同义词、序列

1.数据库对象
  又称模式对象,是逻辑结构的集合。
  最基本的数据库对象就是表。

    数据逻辑结构:指的是存在一种多种特定关系的数据元素集合。
    通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
    再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?

  数据库对象包括:
  同义词、序列、视图、索引、表、函数、包、过程、触发器等。

2.同义词synonym
    同义词——现有对象的一个别名。
    (同义司对网管而言是个非常霸气的东西)
    Oracle只有一个数据库,用户的访问是通过表空间分隔开的,一般来说两个用户之间不能相互访问,但现在A用户要B用户分享某个表中的数据,那B的表空间就要给A分配个权限

    如果只共享表空间中的某个表中的一部分数据,怎么共享?
    ----将某个表共享,但这也向其他用户曝露了表,存在安全问题。因此,我们给要共享的表设置个同义词(别名),将同义词共享给其他用户。

    举例:
    同义词就好比我们要给这个对象取别名,也就是我们所称的“外号”,比如张新宇你们叫他“锤子”,“锤子”就是他的外号;如果某天来个IS来找“锤子”,他找得到么?找不到,“锤子”是不是很安全?IS找门卫问这里有个叫“锤子”的没有?门卫当他傻啊,如果说要找张新宇,找不找得到?找得到。


    同义词分类:
    1.私有同义词;--  只有自己使用; 只能在其模式内访问,且不能与当前模式的对象同名。
    2.公有同义词;--  搞个别名给大家使用;公有同义词可被所有的数据库用户访问。

    同义词作用
    1. 提高安全性
    2. 主要用于资源共享。

    
    模式==对象


1.私有同义词
  语法:
    Create [or replace]  Synonym  syn_emp  For  scott.emp;
    --Synonym   同义词
    --syn_emp   指scott.emp表的同义词(别名)
    --scott.emp 是模式名(对象名),其中emp是表名。
            如果当前是用scott账户在操作,则可以省略scott.

  
2.公有同义词
  语法:
    create public  synonym  syn_emp  for  scott.emp;
    --syn_emp  同义词名(别名)


注意:
  在创建私有同义词时,发现scott也没有权限创建,要让scott有创建的权限,就需要用管理员权限给scott授权。

  为某个账户授权同义词:
    grant create synonym to scott;

  注意:权限授出后,一定要收回(取消授权),否则会乱套。
  取消授权:
    revoke create synonym from scott;


  以上是授权私有同义词,那么公有的同义词呢?
  公有的同义词不能授权,也就是普通账户不能创建公有同义词,除非是管理员账户。
  
  

3.同义词的操作

调用:
    select * from syn_emp;
    --syn_emp 为同义词名(别名)

删除:
    Drop Synonym  syn_emp;        --删除私有同义词
    Drop Public Synonym  syn_emp;    --删除公有同义词


创建或替换(修改):
    create or replace sysnonym syn_emp for scott.emp;

三、序列
    oracle中没有标识列,就是序列,标识列可以做好多东西,有替代品---序列,比标识列麻烦的多。  序列+触发器


    什么是序列?
    序列是用于生成唯一的连续的序号 的对象
    序列有升序和降序。一般都是升序。
1,2,3,4,5,6,7,8

    序列有什么用?
    能为我们生成一组连续的,永远不重复的一组数字。
    主要用于提供主键值,做分页。

    序列就是我们所学的sql server中的标识列:
    标识种子——从什么数字开始,常用1
    标识增量——每次增加的数

1.创建序列语法<色'昆死>
    create sequence 序列名称
        [start with 1]               -- (种子)从n开始计数
        [increment by 1]             -- (增量)每次递增n,负数为递减  <英'克瑞门特>
        [maxvalue n | nomaxvalue]    --  最大值
        [minvalue n | nominvalue]    --  最小值,(没太多含义)
        [cycle | nocycle]             --  循环/不循环<塞叩>
        [cache n | nocache];         --  分配并存入到内存中


--案例:    
create sequence seq_110
start with 1
increment by 1
maxvalue 99999
minvalue 1;


2.使用序列
    通过序列的伪列来访问序列的值。
    nextval——返回序列的下一个值(一直往下,永远不回头,取下一个,指针在下一个值上面)
    currval——返回序列的当前值(取当前的,指针永远在当前值上面)

id    1,2,3,6,4,5,


--案例:
    --查下一个(显示的值不会回头,没有回头的,有回头程序就有问题了)
    select seq_110.nextval from dual;
    (显示的值1,2,3,4,5,……,永远不会回头,显示相同的数字)

    --查当前
    select seq_110.currval from dual;
  


注意!!!:
1.序列不要轻易的删掉
  在SQL Server中,有标识列1,2,3,4的数据,如果删除标识列4的,再增加一条记录,标识列是5。
  在Oracle中,如为某表定义了序列,删除中间的某条记录,情况和SQL Server中一样,但是如果把该表的序列删掉,再创建序列,那么情况就不一样了。


学生信息表
  1,2,3,4,5 , 6, 7,8,9, 10, 11, 13 ,1 ,2 ,3

  序列,currval   nextval  13

   学号为7的学生成绩表  7,90  80

  1,2,3,4,5,6,7,8,9

  所以创建序列这里就不能用:create or replace sequence seq_110;

2.create sequence seq_110; 不写了,可不可以?结果会是什么?
  就是标识列,默认的属性,种子1,递增1,最大值?我也不知道,无聊你们自己去试。


   



    思考:
        既然序列是一组唯一、有序的数字,那在触发器insert时,把序列当做id插入,是否就可以达到了标识列的效果呢?
  


insert into tb_name(tid,tname,tprice)
   values(1,'张三',100);
insert into tb_name(tid,tname,tprice)
   values(2,'李四',100);
insert into tb_name(tid,tname,tprice)
   values(3,'李四',100);
insert into tb_name(tid,tname,tprice)
   values(4,'李四',100);


create sequence seq_110;  //创建一个序列

insert into tb_name(tid,tname,tprice)
   values(seq_110.nextval,'张三',100);  --序列当前值的下一个值

insert into tb_name(tid,tname,tprice)
   values(seq_110.nextval,'李国',100); 


select seq_110.currval from dual;  --序列当前值

要搞清楚这个思路
    在往表里插入一条或多条数据时,会自动执行insert的触发器,
    那么我在编写insert触发器时,手动的将序列放入到触发器,
    每次执行插入一条数据时,添加了一个序列进去。

    不过有些麻烦,要在oracle中做成标识列,要触发器。

(每次插入时搞个触发器,然后在他插入之前,去修改一下他插入的那张临时表inserted,把表里的值就调用这个序列的nextval,这样看上去就看是个标识列。)

    比oracle要麻烦,要强大,有前触发,有后触发。

    思考:如果有100个表,要写多少个序列?1个还是100个?都行,没有标准的。
    如果写一个,100个表共用一个序列,那会造成每个表中的标识列不连贯,比如:
    A表:
    序列1,2,3,4,9,10,11,……
            1,2,3,4,5,6,7,8
    B表:
    序列5,6,7,8,12,13,14,……
         1,2,3,4,

    注意!!!:尽量做到一个表一个触发器一个序列。

    A表  seq_110
        序列1,2,3,5。。。。。。

    B表  seq_120
    序列1,2,3,4,5


4.更改和删除序列
    更改序列:
    alter sequence seq_110 maxvalue 5000 cycle;
    注意:不能更改序列的start with参数
        尽量不要修改,一旦修改会出问题,如果实在要改,先删了再创建序列。

    删除序列:
    drop sequence seq_110;


四、视图
    通过定制的方式显示来自一个或多个表的数据。
    说白了:视图就是一个虚拟表,就是一段查询的SQL语句。
    好处:安全性,降低了程序的复杂程度

--例如:emp查询每个员工的名字、薪水、奖金、收入、部门名称dept


--建议:先写查询语句,再去搞视图
--第1步写查询语句:
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;

是不是每个人都要写这么长段代码?不用,我们根据这需求创建个视图,以后别人要看,就直接调用这个视图名就行了。

--创建这个需求的视图
create or replace view v_emps
as
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;


注意!!!:如果这时运行报错:没有权限,则要通过sys或system账户给scott赋view的权限
    grant create view to scott;


--调用视图:
select * from v_emps;

思考:
--1. 视图是否可以调用视图?(肯定)
--案例:我现在只要姓名,薪水,奖金3个列
create or replace view v_empb
as
select 姓名,薪水,奖金 from v_emps;


--2. 视图是否可以无限次嵌套?(应该不行,SQL Server最多是32层,Oracle中应该也差不多)

--3. 视图的数据是否可以直接修改?(视图的数据保存在表里,视图只是一张虚拟的表)
    理论上来说是可以修改的,这个修改是在修改基表上的数据;
    但有一种合成、聚合的数据,比如“收入”是由薪水+奖金,是不能被修改的。

-------联接视图(要操作)
关于+的,+号在右--->左联 left outer join
        +号在左--->右联 right outer join 
        左右都有+号--->全联  full outer join


-------视图上的DML语句


-------视图中的函数


五、索引
    是数据库内部编排数据的一种方法。
    优点:提高查询速度

--创建索引
Create Index index_name on Tablename(colname,colname...)
tablespace 表空间名;
    --不能使用or replace

--重建索引(修改)
Alter Index index_name Rebuild;

--删除索引
Drop Index index_name;

--唯一索引
Create Unique Index index_name On Tablename(colname);

--组合索引
create index index_name on tablename(colname1,colname2,……);

--反向键索引

--位图索引

--索引组织表
  好处:把数据存储在与其关联的索引中
  最大优点:访问数据都是基于组件
  就是教大家创建表


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle数据库对象---你diss了嘛 的相关文章

  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • STM32讲解

    目录 一 STM32简介 二 STM32命名规则 三 STM32硬件系统简介 四 STM32常用模块以及外设 4 1 STM32引脚介绍 4 1 1通用输入工作模式简介 4 1 2通用输出工作模式简介 4 2 STM32 中断简介 4 3
  • Opencv 模块计算机类型“x64”与目标计算机类型“X86”冲突

    Visual Studio 2012 模块计算机类型 x64 与目标计算机类型 X86 冲突 在使用Visual Studio 2012编译运行OpenCV的时候 出现错误 fatal error LNK1112 模块计算机类型 X86 与
  • Jmeter在windows10命令行启动显示此时不应有

    Jmeter在windows10命令行启动显示此时不应有 Jmeter配置路径正常 直接运行目录下的Jmeter bat也能运行 但是在命令行输入Jmeter便一直显示此时不应有 查了网上这种问题的解决方法 都是说环境变量路径问题 1 路径
  • python 正则表达式 compile_使用compile()函数编译正则表达式【Python技术文章】

    如果需要对一个正则表达式重复使用 那么可以使用compile 函数对其进行预编译 以避免每次编译正则表达式的开销 complie 函数语法格式如下 compile pattern flags 0 上述格式中的参数pattern表示一个正则表
  • input 输入框 focus更改样式

    input标签的border和outline 想要实现input在触发焦点时更改样式 通常会想到使用 focus选择器 但当使用border去更改样式时 会发现失效了 input type text focus border 1px sol
  • 内部振荡器、无源晶振、有源晶振有什么区别?

    单片机要运行起来 必须有一个时钟信号 就好像人的心跳 这个时钟信号可以由无源晶振提供 可以由有源晶振提供 目前大部分的单片机也集成了内部振荡器 今天就来聊聊这三者的区别 1 内部振荡器 单片机内部集成的振荡器 一般为RC振荡器 好多人叫 内
  • AlexNet-深度卷积神经网络(CNN卷积神经网络)

    文章目录 深度卷积神经网络 AlexNet AlexNet 模型说明 激活函数选定 模型定义 读取数据集 训练AlexNet 小结 深度卷积神经网络 AlexNet 2012年 AlexNet横空出世 它首次证明了学习到的特征可以超越出手工
  • cJSON.c 和cJSON.h (进行了额外的封装)

    1 cJSON h cJSON h Copyright c 2009 2017 Dave Gamble and cJSON contributors Permission is hereby granted free of charge t
  • EMI原理、测量、解决

  • 进制和编码

    目标 了解计算机中一些必备的尝试知识 了解常见名词背后的意义 1 python的运行方式 交互式运行 脚本式运行 2 进制 2 1 进制的转换 计算机中底层的所有数据都是0101010101的形式存在的 八进制无法直接转为2进制 十进制转其
  • 鸡兔同笼问题南阳理工学院acm64题

    问题如下 鸡兔同笼 时间限制 3000 ms 内存限制 65535 KB 难度 1 描述 已知鸡和兔的总数量为n 总腿数为m 输入n和m 依次输出鸡和兔的数目 如果无解 则输出 No answer 不要引号 输入 第一行输入一个数据a 代表
  • centos哪个版本稳定_CentOS VS Ubuntu,谁才是更好的 Linux 版本?

    几乎所有新手刚接触 Linux 时 都会被它众多的发行版本搞得一头雾水 截至目前 Linux 已经有几百个发行版本 从技术上来说 Linux 只是一个内核 内核指的是一个提供设备驱动 文件系统 进程管理 网络通信等功能的系统软件 并不是一套
  • 混合式步进电机的细分驱动(电流方式、电压方式)及Simulink仿真对比

    两相混合式步进电机的最简单模型和驱动方式 两相混合式步进电机有四个连接点 分别为a a b b a 和a 连接绕组A的两端 b 和b 连接绕组B的两端 电机的结构可以简化为如下的图示结构 电机转子可以看成一个磁铁 电机的定子上标有a b a
  • OJ刷题 第十三篇

    22102 将字符串反序 时间限制 1 秒 内存限制 128 MB 请将一个给定的字符串反序 字符长度为1到10000 且有可能包含空格 输入 反序前的字符串 输出 反序后的字符串 样例 输入 abcd 输出 dcba 答案 C 版本1 掌
  • 2021年第十二届蓝桥杯省赛A组题解(C/C++)

    2021年蓝桥杯省赛A组题解 C C 来自微信公众号 算法梦工厂 二维码见文末 欢迎加入蓝桥杯备赛群 768245918 获取往届试题 测试数据 算法课程等相关资源 A 卡片 问题描述 答案 3181 解析 涉及知识点 枚举 十进制拆分 做
  • 远程链接redis时出现错误: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    Could not connect to Redis at 192 168 204 100 6379 由于连接方在一段时间后没有正确答复或连接的主机没有反应 连接尝试失败 原因 1 防火墙没有关闭 导致访问不了 解答方法一直接关闭防火墙 不
  • 软件优化Flash擦除时间长的方法

    概述 通过地址的偏移 巧妙的避开Flash擦除长时间占用CPU的使用 MCU STM32H743 编译环境 Keil 说明 基础知识可以看 Flash读写 其中包含了本代码涉及到的所有函数 原理 以空间换取时间 正文 首先要明白Flash擦
  • SpringBoot学习(汇总版)

    一 SpringBoot简介 1 1 Spring能做什么 1 1 1 Spring的能力及生态 1 1 2 Spring5的响应式编程 1 2 SpringBoot是什么 百度百科 Spring Boot是由Pivotal团队提供的全新框
  • MYSQL物理结构

    Mysql的物理结构 日志文件 error log 记录mysql启动 关闭和运行时产生的重大的错误的信息 如果mysqld警告一个表需要自动的检查或者修复 也会记录一个错误日志 可以使用 log error file name选项来指定错
  • Oracle数据库对象---你diss了嘛

    1 数据库对象 2 同义词 3 序列 4 视图 5 索引 Oracle中比较有特色的 同义词 序列 1 数据库对象 又称模式对象 是逻辑结构的集合 最基本的数据库对象就是表 数据逻辑结构 指的是存在一种或多种特定关系的数据元素集合 通俗点