3

我有一个包含几个表的数据库:文件和用户。这种关系是多对多的,所以我还有一个名为 users_files_ref 的表,其中包含上述两个表的外键。

这是每个表的架构:

文件 -> 文件 ID、文件名

用户 -> 用户 ID、用户名

users_files_ref -> user_file_ref_id、user_id、file_id

我正在使用 Codeigniter 构建文件主机应用程序,并且正在添加使用户能够上传文件的功能。这就是我遇到问题的地方。

将文件添加到 files 表后,我将需要该新文件的 id 来更新 users_files_ref 表。现在我正在将记录添加到 files 表中,然后我想我会运行一个查询来获取最后添加的文件,这样我就可以获得 ID,然后使用该 ID 插入新的 users_files_ref 记录。

我知道这将在小范围内起作用,但我想有更好的方法来管理这些记录,尤其是在交通繁忙的情况下。

我是关系数据库的新手,但已经使用 PHP 有一段时间了,所以请耐心等待 :-)

我为文件、用户和 users_files_ref 表正确设置了主键和外键,我只是想知道如何管理在这种情况下添加文件记录?

感谢您提供的任何帮助,非常感谢。

-韦斯

4

3 回答 3

1

用于 $this->db->insert_id()获取您刚刚插入的行的 id 号。此处的更多文档:http: //codeigniter.com/user_guide/database/helpers.html

于 2010-04-04T21:15:54.600 回答
0

我认为你需要的是这样的:

                   ----primary key-----
users_files_ref -> | user_id, file_id |

如何获取 file_id 取决于您正在实现的代码。你的推理是正确的。您已经有了 user_id,只需要获取 file_id。使用这些值,您可以向 user_files_ref 添加新行。

当我需要这样做时,我通常有一个存储过程,它借助插入文件并将序列NEXTVAL作为输出返回的序列。这可能是实现这种场景的一种方式。

这是基于 Oracle 的存储过程的代码:

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE    IN  FILE.FILE%TYPE,
                                           FILE_ID OUT NUMBER)

IS

BEGIN

  SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL;

  INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE);

END SP_IMPORT_FILE;
于 2010-04-04T19:08:25.787 回答
0

您基本上是在描述它通常是如何完成的,并进行了一项重要调整:如何检索文件的 file_id 以便能够将其添加到 users_files_ref。

通常在数据库环境中,您有许多客户端同时连接,同时进行更新。在这样的环境中,您不能只获取添加的最后一个文件的 file_id - 它可能是在您的数据库调用之间添加的其他人的文件。您必须使用数据库的功能来获取生成的 ID(例如SELECT @@IDENTITY在 MSSQL 上)或以某种方式在应用程序代码中生成 ID。

于 2010-04-04T19:09:33.437 回答