Php MySQL上目录树中的唯一文件名

Php MySQL上目录树中的唯一文件名,php,mysql,database,Php,Mysql,Database,我试图找到最有效的代码来捕获父文件夹中的重复文件名。 我正在使用带有沿袭的父子模型将文件树存储在MySQL数据库中: CREATE TABLE `filetable` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, `parent_id` int(11) NOT NULL, `path_num` varchar(255) NOT NULL, `path_string`

我试图找到最有效的代码来捕获父文件夹中的重复文件名。 我正在使用带有沿袭的父子模型将文件树存储在MySQL数据库中:

CREATE TABLE `filetable` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(50) NOT NULL,
    `parent_id` int(11) NOT NULL,
    `path_num` varchar(255) NOT NULL,
    `path_string` text() NOT NULL,  
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
我正在考虑两种方法:
1.运行查询:

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    SELECT '$name','$pid','$path_num','$path_string' FROM DUAL
        WHERE NOT EXISTS
            (SELECT name FROM filetable WHERE name='$name');
在PHP中:

if (mysql_affected_rows() === 0) takeAction($name);
优点:简单的sql,无需向表中添加行
缺点:双重查询可以在大表上获取雪花

2.在字段上创建唯一索引并使用:

INSERT INTO filetable (name, parent_id, path_num, path_string) 
    VALUES ('$name','$pid','$path_num','$path_string')
    ON DUPLICATE KEY UPDATE 0=0;
在PHP中:

if (mysql_affected_rows() === 2) takeAction($name); // Yes 2 for updates
优点:当重复
name
时,一小部分查询会触发更新
缺点:表格中多了一行

唯一的字段是路径字符串,即文件的完整路径。在我的文件系统中,它可能会变得很长,因此是一个文本类型的字段。在MySQL中,无法在文本字段上创建唯一索引。所以我想做的是创建一个专栏

`problemsolver` varchar(62) = $parent_id . '_'.$name 
并且在它上面有唯一的索引

我预计这些查询将占数据库所有查询的10%


我的问题是,你会使用这两种方法中的哪一种,为什么?或者有更好的选择吗?

两种方法都可以。方法1并不理想,因为您的查询更加密集,而且每次都会执行,正如您所说,这不是每次都需要的

方法二更可取,因为您只在需要时做额外的工作,而且效率更高


此外,为了减少可能出现的冲突值,您可以在存储的值中集成时间戳或一些随机数据。

唯一索引s.t如何。您的插入将失败,然后检查结果?我建议在唯一字段中添加一个唯一键,然后使用
INSERT IGNORE
-保存秒数
INSERT。。。在重复的情况下
需要,而您实际上并不是在寻找错误捕获(至少不是为了重新执行查询)。同样相关的还有: