序列
用于数值类型的主键
create sequence seq_stu_id
start with 1 --从1开始
increment by 1 --间隔是1
maxvalue 200 --最大时200
nocycle --不循环
nocache; --可以在数据字典user_sequences查看
--如何用序列 nextval下一个值,currval当前值
select seq_stu_id.currval from dual;
同义词
synonym?相当于链接,是因为为了更快的去访问别的用户的表
由于在查表时的全称是
用户.表名
当用户A想访问用户B的表时在用户B或sys先授
grant all on 表名 to 用户A --授所有权限
然后a就可以访问,还可以再创建一个同义词
--在sys里把授创建同义词的权力给他
grant create synonym to 用户B;
--在用户B中创同义词
create synonym 同义词名 for 用户B.表名;
事务
将一系列操作看成原子操作
原子性,隔离性(事务中的语句相互独立),一致性(语句要么同时成功要么同时失败),持久性(commit后就保存到数据库了)
对每条数据的操作(select 不是)相当于临界区,有互斥性,只有commit 和rollback才表示完成退出临界区
使用 update 抢锁进入临界区,进行要求全部操作 全部完成后看结果是否符合基本要求,如果符合则commit,不符合rollback.
【进行转账A给B 100,
客户端1:
update account set balance=balance-100 where aaccount_name='A';--抢到A的锁
update account set balance=balance+100 where aaccount_name='B';--抢到B的锁
select *from?account; --看账户是否大于0,大于0则commit
】
死锁
互斥,循环等待,不可剥夺,请求保持
【
客户端1:
update account set balance=balance-100 where aaccount_name='A';--抢到A的锁
update account set balance=balance+100 where aaccount_name='B';--等B的锁
客户端2:
update account set balance=balance-100 where aaccount_name='B';--抢到B的锁
update account set balance=balance-100 where aaccount_name='A';--等A的锁
】
oracle用有限等待打破死锁
数据库的设计
第一范式:字段设计要不可再分,单表的设计
第二范式:多张表中,只存关系,不存具体信息
第三范式:两张表的关系在第三张表中体现
【在实际开发中,个人信息可能有十几个字段,但登录时只会用到几个字段信息,为了性能可以分成两个表】
第四范式:数据库设计依赖于实际
递归表,树形表
id | name | tid(父节点) | pid(属于什么类型) |
1 | 家用电器 | ||
2 | 办公 | p1 | |
3 | 电脑 | p2 | |
4 | 手机 | p3 | |
5 | 运行商 | p3 | |
6 | 数码 | p3 | |
7 | 手机通信 | p3 | 7 |
8 | 运行商 | p3 | 8 |
9 | 摄影摄像 | p3 | 9 |
10 | 手机 | 7 | 10 |
11 | 合约机 | 8 | 11 |
12 | 数码相机 | 9 | 12 |
当要选择家用电器下的,显示出手机/运营商/数码,应该找到
---创表
create table jd(
jid int primary key,
name varchar2(20),
tid varchar2(3),
pid varchar2(3));
---插入数据
insert into jd values (1,'家用电器',NULL,NULL);
insert into jd values(4,'手机',NULL,'p3');
insert into jd values(5,'运营商',NULL,'p3');
insert into jd values(6,'数码',NULL,'p3');
insert into jd values(7,'手机通信','p3','7');
--代码块
declare
cursor mycur is select name from jd where pid='p3';
tmp varchar2(20);
begin
open mycur;
loop
fetch mycur into tmp;
exit when mycur%notfound;
dbms_output.put(tmp||'/');
end loop;
DBMS_OUTPUT.NEW_LINE;
close mycur;
end;
权限表
用户表
用户权限表
权限表
权限角色表
角色表(某种角色有一堆权限)(connect,resource)
用户角色表
用户表 | |
uuid | name |
1 | jack |
2 | rose |
3 | peter |
权限表 | |
pid | name |
1 | create session |
2 | create table? |
3 | create user |
角色表 | |
rid | name |
1 | connect |
2 | resource |
3 | sysdba |
用户权限表? n-m | |
uuid | pid |
1 | 1 |
1 | 2 |
2 | 1 |
3 | 1 |
权限角色表 n-m | |
pid | rid |
1 | 1 |
1 | 2 |
2 | 1 |
2t | 2 |
用户角色表 n-m | |
uuid | rid |
1 | 1 |
2 | 2 |
2 | 1 |
3 | 1 |
查询Jack的权限
--用户表
create table tuser(
uuid int primary key,
name varchar2(10));
--权限表
create table tp(
pid int primary key,
name varchar2(20));
--角色表
create table trole(
rid int primary key,
name varchar2(10));
--用户权限表
create table tu_p(
uuid int ,
pid int
);
--权限角色表
create table tp_r(
pid int ,
rid int
);
--用户角色表
create table tu_r(
uuid int ,
rid int
);
--插数据
insert into TUSER values(1,'jack');
insert into TUSER values(2,'rose');
insert into TUSER values(3,'peter');
insert into Tp values(1,'create session');
insert into Tp values(2,'create table');
insert into Tp values(3,'create user');
insert into trole values(1,'connect');
insert into trole values(2,'resource');
insert into trole values(3,'sysdba');
insert into tu_p values(1,2);
insert into tu_p values(1,1);
insert into tu_p values(2,1);
insert into tu_p values(3,1);
insert into tp_r values(1,2);
insert into tp_r values(1,1);
insert into tp_r values(2,1);
insert into tu_r values(2,2);
insert into tu_r values(1,1);
insert into tu_r values(2,1);
insert into tu_r values(3,1);
--通过用户权限表查询
select * from tuser t1
join tu_p t2 on t1.uuid=t2.uuid
join tp t3 on t2.pid=t3.pid
where t1.name='jack';
--通过用户角色
select * from tuser t1
join tu_r t2 on t1.uuid=t2.uuid
join tp_r t3 on t2.rid=t3.rid
join tp t4 on t4.pid=t3.pid
where t1.name='jack';
一对多,多对一,多对多
当在设计表时,可以从使用场景来分,每辆车开始时都会填信息表,在运行时填运行状态表,维修人员填维修表
小车基本信息
id (车的唯一标识) | len(轨道长度) | inductor_loc_1(感光板一的位置) | inductor_loc_2(感光板二的位置) | laser_loc_1(减速器位置) | laser_loc_2 | create_time |
1 | 10 | 0 | 10 | 1 | 9 | |
2 | 15 | 0 | 13 | 1 | 12 |
小车维修表
oid(操作记录的主键) | id | operator(操作人员) | case(出现故障的原因) | create_time |
小车运行表
lid | id | status | create_time |
故障的数据字典 | |
E001 | 未正常降速 |
E002 | 预警灯坏了 |
E003 | 轨道故障 |
其中如果想要id号唯一可以时间戳+设备ID+序列号,数据字典则是可以规范填表,做好统计。
--建表
create table car_in(
id int primary key,
len number(10,2),
inductor_loc_1 number(10,2),
inductor_loc_2 number(10,2),
laser_loc_1 number(10,2),
laser_loc_2 number(10,2),
create_time timestamp
);
create table run(
lid varchar2(100) primary key,
id int,
status int,
create_time timestamp
);
create table oprate(
oid varchar2(100) primary key,
id int,
operate int,
casec varchar2(10),
create_time timestamp
);
SELECT * FROM oprate;
insert into car_in values('1' ,'10' ,'0', '10', '1', '9',sysdate-420);
insert into car_in values(2 ,15, 0 ,13 ,1 ,12,sysdate-1842);
insert into car_in values(3,15,0,15,2,13,sysdate-1122);
insert into run values(sysdate||'-'||1||1,1,0,sysdate);
insert into run values(sysdate-20||'-'||1||2,1,2,sysdate-20);
insert into oprate values(sysdate||'-'||'1-'||1,1,7655,'E001',sysdate);
insert into oprate values(to_char(sysdate)||'-'||'1-'||2,1,7655,'E002',sysdate);