2

我是 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)在数据库填充任务期间是否可以使用这两个函数(乘以它们返回的结果)?

插入战斗值(....,f(x)* f(y),'战利品A');

为了填充战斗表中的所有 total_experience 条目?

谢谢您的帮助

4

1 回答 1

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 中,您通过创建一个序列来做到这一点(在大多数其他数据库中它更简单)。

于 2013-03-02T21:17:12.117 回答