Showing posts with label database. Show all posts
Showing posts with label database. Show all posts

Sunday, March 8, 2015

今天争取把TRIGGER做出来

今天周日,不出意外还有10天就要结束本学期乃至学生生涯。

本周五



周五将有一堆事


  1. master project report和slides的due


  2. CSE132b的milestone4和milestone5的due


  3. 体检




下周




  1. master project的presentation


  2. CSE132b的final的due




CSE132b



争取今天把132b的milestone4和5做完。

这个是比较好的TRIGGER讲解LINK

英文原版LINK

Master Project



report草稿写的差不多,不过slides还没开始做。等老师答复。

自勉



本周要把project收尾,132b收尾,退税搞定,体检搞定。自勉,加油!
read more ››

Thursday, February 26, 2015

PostgrSQL的backup和restore

今天做132的project有个小小的发现,

对当前以后的数据库备份有不少帮助。

以前总是用手动备份数据库,到另一台电脑上还要CREATE TABLE手动加数据。

project本身做起来颇为麻烦,若再因为备份和迁移伤神,岂不痛苦?

就找到了一个backup所有数据库信息和restore的方法。

看这里

backup的时候把后缀名改为.backup,在新机器中写好数据库名在tools中选restore刚才的.backup文件即可。
read more ››

Wednesday, February 25, 2015

CREATE VIEW

CREATE VIEW



今儿上课讲CREATE VIEW

PostgreSQL 8.1 中文文档

Schema

employee(ssn, name, salary, s_ssn, deptNo)
dept(dno, dname, address)

Naive SQL

[code language="sql"]
SELECT d.dname, max(e.salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY d.dno, d.dname
[/code]

Materialized View

[code language="sql"]
CREATE TABLE V (dno, sal)
populate table offline
INSERT INTO V (dno, sal)
SELECT e.depNo as dno, max(e.salary) as sal
FROM employee e
GROUP BY e.deptNo
[/code]

Get deptname

[code language="sql"]
SELECT d.dname, v.sal
FROM V v, dept d
WHERE v.dno = d.dno
[/code]

When update or delete...

If new employee has more salary that max salary?

Need to look into the base sql. second highest salary?

How to do better?

[code language="sql"]
CREATE TABLE V’(dno, maxSal, mSalCnt, secondSal, sSalCnt)
[/code]

To be continue..
read more ››

Monday, February 23, 2015

Precomputation and Materialized Views

今天132b上课讲DB的preocomputation。

Materialized Views



Wiki Page


 In computing, a materialized view is a database object that contains the results of a query. For example, it may be a local copy of data located remotely, or may be a subset of the rows and/or columns of a table or join result, or may be a summary based on aggregations of a table's data.The process of creating a materialized view is sometimes called materialization. It is sometimes described as a form of precomputation. As with other forms of precomputation, materialized views are typically created for performance reasons, i.e. as a form of optimization.

 In any database management system following the relational model, a view is a virtual table representing the result of a database query. Whenever a query or an update addresses an ordinary view's virtual table, the DBMS converts these into queries or updates against the underlying base tables. A materialized view takes a different approach in which the query result is cached as a concrete table that may be updated from the original base tables from time to time. This enables much more efficient access, at the cost of some data being potentially out-of-date.


What is the difference between Views and Materialized Views


 Materialized views are disk based and update periodically base upon the query definition.

Views are virtual only and run the query definition each time they are accessed.

 Also when you need performance on data that don't need to be up to date to the very second, materialized views are better, but your data will be older than in a standard view.


Precomputation



Precomputation是和Materialized View对应的。

[code language="sql"]

SELECT e.deptNo, max(salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY e.deptNo

[/code]

可先precompute

[code language="sql"]
CREATE TABLE Q’
INSERT INTO Q’
(
SELECT e.deptNo, max(salary) AS sal
FROM employee e, dept d
WHERE e.deptNo = d.dno
GROUP BY e.deptNo
)
[/code]

一些SQL巧用



text转时间



在数据库中我以text存储时间,但是这样不能直接比较时间大小,故寻得此法:

[code language="sql"]
SELECT *
FROM table
WHERE CAST(StartTime As Time) > CAST(EndTime As Time)
[/code]

感觉就是强制类型转换,将类似13:00的text转化为time。

SQL中的for循环



决定暂时不用for循环,for循环打算写在jsp里。我还有一些其他需求,基本也都找到了方法。

date BETWEEN



在数据库里我以text ‘YYYY-MM-DD’形式保存时间,但是遇到在两个时间区段取时间的问题。PostgreSQL可以照常使用BETWEEN来检查。

[code language="sql"]
SELECT *
FROM review
WHERE review_date BETWEEN '2014-01-01' AND '2014-03-01'
[/code]

get day of week



PostgreSQL内部也有取已知日期是星期几的功能。

[code language="sql"]

SELECT review_date, extract(dow from review_date::timestamp)
FROM review
WHERE review_date BETWEEN '2014-01-01' AND '2014-03-01'

[/code]

这么一来,我在review表里存的星期信息就多余了,还得改表。

Getting date list in a range in PostgreSQL



还有,给起点终点,我想取出一段连续的日期,如下。

[code language="sql"]

SELECT aval_date::date
FROM generate_series('2012-06-29',
'2012-07-03', '1 day'::interval) aval_date

[/code]

代码不难,我卡住了。我想把这个aval_date作为大SQL语句WHERE的一部分,结果愣是想不出怎么写。后来测试一下SELECT * 发现默认的attribute就是aval_date。这下直接去大SQL把WHERE中写成aval_date=...就行了。

这个review的available的date time的SQL算是写好了,可能对另一个题也有启发。继续!

Getting date list in a range in PostgreSQL

关于临时表



之前对TEMP TABLE的理解就是中间变量。后来Wizard告诉我,TEMP TABLE多用在建出来一个马上要访问很多次取结果的或者中间结果太大放不下内存的。看来需要改动一些,放在同一个query语句中会更好,就用nested query吧。

更新:目前nested query果然好用,不理temp table了!
read more ››

Thursday, February 19, 2015

PostgreSQL临时表(in progress)

以前上135时学过临时表,奈何忘了大半。现如今做132要用,现来回顾一下。


 临时表在会话结束时自动删除, 或者是(可选)在当前事务的结尾(参阅下面的 ON COMMIT)。 现有同名永久表在临时表存在期间在本会话过程中是不可见的, 除非它们是用模式修饰的名字引用的。 任何在临时表上创建的索引也都会自动删除。


PostgreSQL文档

PostgreSQL 8.1 中文文档

还在学习中,回头补充。

最近肯定要经常用temp table和trigger咯。

In Postgres, temporary tables are deleted when connection to the database is closed. Therefore, there is no need to drop the temporary table explicitly.

一直弄不清check
read more ››

Wednesday, February 18, 2015

CREATE TRIGGER

今天132B上学了点新东西,CREATE TRIGGER



[code language="sql"]CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER |CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE funcname ( arguments )
[/code]

name
赋予新触发器的名称。它必需和任何作用于同一表的触发器不同。

BEFORE
AFTER
决定该函数是在事件之前还是之后调用。

event
INSERT,DELETE 或 UPDATE 其中之一。 它声明击发触发器的事件。多个事件可以用 OR 声明。

table
触发器作用的表名称(可以用模式修饰)。

FOR EACH ROW
FOR EACH STATEMENT
这些选项声明触发器过程是否为触发器事件影响的每个行触发一次, 还是只为每条 SQL 语句触发一次。如果都没有声明, FOR EACH STATEMENT 是缺省。

funcname
一个用户提供的函数,它声明为不接受参数并且返回 trigger 类型。


 允许你为 "old" 和 "new" 行或者表定义别名,用于定义触发器的动作(也就是说, CREATE TRIGGER ... ON tablename REFERENCING OLD ROW AS somename NEW ROW AS othername ...)。


PostgeSQL触发器写法

> 一个触发器是一种声明,告诉数据库应该在执行特定的操作的时候执行特定的函数。触发器可以定义在一个 INSERT, UPDATE, DELETE 命令之前或者之后执行,要么是对每行执行一次,要么是对每条 SQL 语句执行一次。如果发生触发器事件,那么将在合适的时刻调用触发器函数以处理该事件。触发器函数必须在创建触发器之前,作为一个没有参数并且返回 trigger 类型的函数定义。触发器函数通过特殊的 TriggerData 结构接收其输入,而不是用普通的函数参数方式.


> PostgreSQL 提供按行按语句触发的触发器。按行触发的触发器函数为触发语句影响的每一行执行一次;按语句触发的触发器函数为每条触发语句执行一次,而不管影响的行数。特别是,一个影响零行的语句将仍然导致按语句触发的触发器执行。这两种类型的触发器有时候分别叫做行级触发器和语句级触发器。触发器还通常分成 before 触发器和 after 触发器。语句级别的"before"触发器通常在语句开始做任何事情之前触发,而语句级别的"after"触发器在语句结束时触发。行级别的"before"触发器在对特定行进行操作之前触发,而行级别的"after"触发器在语句结束的时候触发(但是在任何语句级别的"after"触发器之前)。


PS: 还是不是很明白,我再想想吧。

PPS: 今天project meeting让我也松懈不得啊。requirement一直在变,我除了想法子debug,还要满足需求。哎好累。

read more ››