我正在尝试找到最有效的代码来捕获父文件夹中的重复文件名。我正在使用具有血统的父子模型将文件树存储在 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
优点:重复时在一小部分查询上触发更新
缺点:表中的额外行
唯一的字段是 path_string,即文件的完整路径。在我的文件系统中,它可能会变得很长,因此是 TEXT 类型的字段。在 MySQL 中,无法在 TEXT 字段上创建唯一索引。所以我想做的是创建列
`problemsolver` varchar(62) = $parent_id . '_'.$name
并在其上创建唯一索引。
我希望这些查询构成对数据库的所有查询的 10%。
我的问题是你会使用这两种方法中的哪一种,为什么?还是有更好的选择?