我是 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 fights VALUES(.... , f(x) * f(y), '战利品 A');
为了填充 fights 表中的所有 total_experience 条目?
谢谢你的帮助
最佳答案
在 SQL 中,您通常不会谈论构建函数来做事。 SQL 的构建 block 是查询、 View 和存储过程(大多数 SQL 方言确实都有函数,但这不是开始的地方)。
因此,给定一个带有 $FIGHTID 的变量,您将通过使用 join
操作的简单查询来获取单一体验:
select unitary_experience
from fight f join
spawnTypes st
on st.spawn_point = f.foe_spawn_point
where fightid = $FIGHTID
如果您要插入一系列值以及一个函数,我建议您使用 insert
的 select
形式:
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 中,您通过创建一个序列来完成此操作(在大多数其他数据库中它更简单)。
关于sql - 检查后从表中返回值的 PL/SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179395/