2013-02-17 76 views
2

我面临着处理多个文档的挑战,特别是处理数据库中重复的文件名。我正在尝试创建一个管理员可以添加HTML文档的系统。他将输入两个字段:文档的名称和源代码。插入时,如何将重复名称更改为数据库中的其他内容?

添加文档时,名称(例如“A Page”)和文件名(基于名称,例如“a_page.html”)将被插入到数据库中,并且将创建一个包含源代码的文件在服务器上。

现在的问题是如果我尝试添加另一个具有相同名称的文档会发生什么,例如“页面”。我希望文件名是“a_page_2.html”,不覆盖现有文件名。如果另一个同名,“a_page_3.html”等。

是否有一个简单的SQL语句来实现?

+1

在MySQL中还有的对重复KEY语法。你可能想看看 – GordonM 2013-02-17 09:26:08

+0

是的,你可以设置你的字段为UNIQUE – vikingmaster 2013-02-17 09:35:22

+0

http://stackoverflow.com/questions/4702059/insert-contacts-into-database-but-does-not-want-to-duplicate-已经存在的公司 – mithunsatheesh 2013-02-17 09:36:14

回答

1

不,没有简单的说法。可能已经有a_page_2.html了。

所以,只要让你的文档名称已独特:

  • 插入数据库
  • 获得唯一的ID
  • 使用这个ID,通过放在一起给定的名称和ID
  • 创建文件新纪录

当选择文件名,你可以做到这

SELECT concat(name,'_',id) as name ... 

它类似于#1产生的问题URL的方式:

/questions/14919687/on-insert-how-can-i-change-the-duplicate-name-to-something-else-in-the-database/ 
      ^id ^conventional name that can have 1000s duplicates 

您也可以摆脱传统的名字在所有的,只留下IDS:
http://stackoverflow.com/questions/14919687/仍然有效

+0

但他然后会得到像fileA_151235而不是fileA_2 – Roy 2013-02-17 09:43:54

+0

嗯......这是一个有趣的解决方案。不幸的是,我将文件从旧系统移动到名称已经是“a_page.html”的新系统,因此我需要将它们全部重命名。我将不得不编写一个脚本来重命名所有文件。 – Mikey 2013-02-17 14:11:49

-1
  • 使文件名称列UNIQUE
  • 尝试插入并且如果您有重复密钥错误,请重复添加数字直至成功

随着PDO它可能看起来像:

class QueryException extends RuntimeException { } 
class DuplicateKeyException extends QueryException { } 

function executeInsert(PDOStatement $stmt) { 
    try { 
     $stmt->execute(); 
    } catch (PDOException $e) { 
     switch ($e->errorInfo[1]) { 
      case 1062: 
       throw new DuplicateKeyException($e->getMessage(), null, $e); 
      default: 
       throw new QueryException($e->getMessage(), null, $e); 
     } 
    } 
} 

$filename = 'a_page'; 
$contents = '<title>test</title>'; 

$stmt = $pdo->prepare('INSERT INTO documents (filename,contents) VALUES (:filename,:contents)'); 
$repeat = true; $counter = 0; 
while ($repeat) 
    try { 
     $stmt->bindValue(
      ':filename', 
      $filename . ($counter > 0 ? ("-$counter" : '') . '.html' 
     ); 
     $stmt->bindValue(':contents', $contents); 
     executeInsert($stmt); 
     $repeat = false; 
    } catch (DuplicateKeyException $e) { 
     $repeat = true; 
     $counter++; 
    } catch (QueryException $e) { 
     $repeat = false; 
     // error handling here 
    } 
} 
+0

我其实正在考虑沿着这些线条的东西,但如果我有一个名为“a_page_10”的文件名,会发生什么?这意味着我需要进行11次数据库调用,我认为这不会太高效。机会虽然我可能永远不会得到那么多重复,但任何事情都可能发生。 – Mikey 2013-02-17 14:06:14

+1

另一种方法是首先对文件名进行LIKE查询,以检查最小可用编号。如果你期望几乎每一个插入都有重复,你可能会考虑这一点。但除此之外,我更喜欢一种解决方案,它的速度> 99%,特殊情况下速度合理。 – 2013-02-17 15:58:41

相关问题