我有一个包含几个表的数据库:文件和用户。这种关系是多对多的,所以我还有一个名为users_files_ref的表,它保存了上述两个表的外键。
这是每个表的架构:
个文件 - > file_id,file_name
用户 - > user_id,user_name
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表正确设置了主键和外键,我只是想知道如何管理此场景的文件记录添加?
感谢您提供的任何帮助,非常感谢。
-Wes
答案 0 :(得分:1)
使用$this->db->insert_id()
获取刚刚插入的行的ID号。这里有进一步的文档:http://codeigniter.com/user_guide/database/helpers.html
答案 1 :(得分: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;
答案 2 :(得分:0)
您基本上是通过一项重要调整来描述它是如何完成的:如何检索文件的file_id以便能够将其添加到users_files_ref。
通常在数据库环境中,您有许多客户端同时连接,同时进行更新。在这样的环境中,您不能只获取添加的最后一个文件的file_id - 它可能是在您的数据库调用之间添加的某个elses文件。您必须使用数据库的功能来获取生成的ID(例如,MSSQL上的SELECT @@IDENTITY
)或以某种方式在应用程序代码中生成ID。