Right-click any area in the editor and select Reformat. Alternatively, press Ctrl+Alt+L.
format sql
有时候需要手动导入 schema 才能 insert test 来着
嗯,本来应该在本机上安装sql的……不过还是不要搞这种操作了,先搞定 maven 的依赖。已经安装好了,所以直接 open pom.xml 就可以,intelliJ 会自己搞定的
刚开始 symbol java cannot solve,打开 File Menu -> Project Structure,将 JDK 改成 11
一些命令
mvn -q exec:java@gig
quiet mode,only produce error
exec:java 应该是compile的意思,然后后面是项目名字?大概吧
好了现在搞定远程 ssh 开发了,本地电脑通过 git 同步,和 DCS 就通过 ssh
唉之前写的那一些搞丢了吗qwq糟糕糟糕,不过没事继续写吧……
如果 mapping 的文件和远程不一致,先手动上传整个文件一次,然后就可以使用快捷键上传了。当然请记得检查是否真的上传了……
对照学校要求检查了一遍,现在就要搞定不能跨越时间的问题了
https://www.postgresql.org/docs/current/functions-datetime.html
这里查看 time 可以使用的 func,我的想法是使用
1 | date_part` ( `text`, `timestamp` ) → `double precision |
Get timestamp subfield (equivalent to extract
); see Section 9.9.1
1 | date_part('hour', timestamp '2001-02-16 20:38:40') → 20 |
提取开场时间的 hour 和 minute,变成分钟再加上持续时间,看是否超过 24*60
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-CHECK-CONSTRAINTS
涉及到多个条目的 check 要写在最下面
1 | CREATE TABLE products ( |
但是 check 似乎不能直接使用 func,需要一个 view?
SELECT date_part(‘hour’,ontime), date_part(‘minute’,ontime) FROM act_gig as hour where actid = 2 and gigid = 50;
这样可以弄出 hour 和 min,但是怎么指定同一个呢……
SELECT date_part(‘hour’,ontime)*60+date_part(‘minute’,ontime)+duration as last FROM act_gig as hour where actid = 2 and gigid = 50;
这样就可以算了!
https://www.sqlshack.com/how-to-use-sql-check-constraints/
淦,create func 好怪哦,要用 $$ 围起来
1 | CREATE FUNCTION one() RETURNS integer AS $$ |
划掉,其实原始是可以的……
1 | CREATE TABLE act_gig |
是我没有上传成功……哼唧
java 编写
测试 ./run.sh test 1
测试 option 1,以此类推
需要内置 data
1 | $ ./run.sh reset tests/testbig.sql && ./run.sh test 1 |
task 1
line-up, using gig id, find all act on gig, line up by start time.
show actname, start time, end time
CAST can change format of the values
https://www.w3schools.com/sql/func_sqlserver_cast.asp
CAST(expression AS datatype(length))
1 | SELECT act.actname AS "Act Name", |
first one like this, place holder at gigid
https://blog.csdn.net/u013159040/article/details/45605637
how to output 2d array
task 2:
首先会读到很多 array,先加上 gig,然后再加上 gig_act,如果其中有一个失败了,那就删除所有。用一个 array 存储正在添加和添加完成的,一共会有 act 相关 array + 2 (包括 gig,ticket)三个 act_gig,然后一个 for 循环删除剩下的走你
删除 id 最大的
delete from gig where gigid in (select max(gigid) from gig);
可以跑得通,但是需要先 del 掉所有关联外键。先 del 所有 gig_act, then is ticket, last is gig
using successAct to count how many act is successful added, and for loop to del
http://sqlines.com/postgresql/datatypes/serial
1 | INSERT INTO teams VALUES (DEFAULT, 'Manchester City'); |
serial input value is default.
https://jdbc.postgresql.org/documentation/head/8-date-time.html
传入时间使用 setobject
因为自己传入的不会自动 serial 下去,所以使用
INSERT INTO gig VALUES ((select max(gigid) from gig)+1, 6, 'TESTING', '2018-12-11 19:00:00', 'GoingAhead');
总之你还是手动查看吧,先看增和删是否成功
啊要先查询 venue 才行……这个不会是空
https://bbs.csdn.net/topics/300206461
可以写个 bool 判断是否成功插入,不对,这个要看
https://www.letianbiji.com/jdbc/jdbc-execute-executequery-executeupdate.html
executeQuery for SELECT,返回 ResultSet,失败大概是 null,executeUpdate for 其他,返回影响行数,失败是 0
execute 通用,返回 bool,true 是 ResultSet, false 是返回 int
对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
fail constrain 是报错,加个 try catch 就好
option 3
这个会预订不存在的 gig 场次,或者其他什么报错,没事啦都写好 FK 了
如果不存在就报错,所以直接 try 就可以了
option 4
这个是要写个 function 去 call 了说实话……
AS
starts the definition of the method
SELECT max(ontime) FROM (SELECT * FROM act_gig WHERE gigid=14) AS sa;
这样可以找到
SELECT actid FROM act_gig WHERE gigid=14 ORDER BY ontime DESC LIMIT 1
这样更方便,limit 是只可以显示 1 个
选择先去挑序列,然后逐个传入,call func 是
https://www.postgresqltutorial.com/postgresql-jdbc/call-postgresql-stored-function/
select * from iscancel(?,?,?)
option 5
创造了一大堆 view 去完成,效率什么的完全不考虑了,写出来就成
check
啊,似乎光写 constrain 不行,可以使用 row num 来排序,然后查看上下两场的排序就可以啦!
https://www.postgresqltutorial.com/postgresql-row_number/
partition by gigid, order
使用 lead 和 lag 来记录,lag 访问之前一列,lead 访问