我是php和sql的新手,我正在构建一个小游戏来学习后者的更多内容。
这是我的三个表的简单数据库:
-- *********** SIMPLE MONSTERS DATABASE
CREATE TABLE monsters (
monster_id VARCHAR(20),
haunt_spawn_point VARCHAR(5) NOT NULL,
monster_name VARCHAR(30) NOT NULL,
level_str VARCHAR(10) NOT NULL,
creation_date DATE NOT NULL,
CONSTRAINT monster_id_pk PRIMARY KEY (monster_id)
);
-- ****************************************
CREATE TABLE spawntypes (
spawn_point VARCHAR(5),
special_tresures VARCHAR (5) NOT NULL,
maximum_monsters NUMBER NOT NULL,
unitary_experience NUMBER NOT NULL,
CONSTRAINT spawn_point_pk PRIMARY KEY (spawn_point)
);
-- ****************************************
CREATE TABLE fights (
fight_id NUMBER,
my_monster_id VARCHAR(20),
foe_spawn_point VARCHAR(5),
foe_monster_id VARCHAR(20) NOT NULL,
fight_start TIMESTAMP NOT NULL,
fight_end TIMESTAMP NOT NULL,
total_experience NUMBER NOT NULL
loot_type NUMBER NOT NULL,
CONSTRAINT my_monster_id_fk FOREIGN KEY (my_monster_id)
REFERENCES monsters (monster_id),
CONSTRAINT foe_spawn_point_fk FOREIGN KEY (foe_spawn_point)
REFERENCES spawntypes (spawn_point),
CONSTRAINT fight_id_pk PRIMARY KEY (fight_id)
);
鉴于此数据,我如何轻松执行这两项任务:
1)我想创建一个pl / sql函数,只传递一个fight_id作为参数,并给出foe_spawn_point(在斗争表内)返回与引用spawntypes表的这个生成点相关的unitary_experience,怎么能我做到了吗? : - / [f(x)]
为了计算从战斗中获得的总体验(unitary_experience * fight_length),我创建了一个函数,给定一个特定的战斗将使用fight_start减去fight_end所以现在我知道战斗持续了多长时间。并[f(Y)]
2)在数据库填充任务期间是否可以使用这两个函数(将它们返回的结果相乘)?
INSERT INTO战斗VALUES(....,f(x)* f(y),'抢劫A');
为了填充战斗表中的所有total_experience条目?
谢谢你的帮助
答案 0 :(得分:1)
在SQL中,您通常不会谈论构建函数来执行操作。 SQL的构建块是查询,视图和存储过程(大多数SQL方言做都有函数,但这不是起点)。
因此,给定一个带有$ FIGHTID的变量,您可以使用join
操作的简单查询获取单一体验:
select unitary_experience
from fight f join
spawnTypes st
on st.spawn_point = f.foe_spawn_point
where fightid = $FIGHTID
如果要插入一系列值以及函数,我建议使用select
形式的insert
:
insert into fights(<list of columns, total_experience)
select <list of values>,
($FIGHT_END - $FIGHT_START) * (select unitary_experience from spawnTypes where spawnType ='$SPAWN_POINT)
关于表格的一条评论。表中的所有id都是自动递增的整数,这是个好主意。在Oracle中,您可以通过创建序列来完成此操作(在大多数其他数据库中它更简单)。