在插入时,如何将重复的名称更改为数据库中的其他名称?

时间:2013-02-17 09:23:21

标签: php mysql duplicates

我正在使用多个文档进行挑战,尤其是处理数据库中的重复文件名。我正在尝试创建一个管理员可以添加HTML文档的系统。他将输入两个字段:文档名称及其源代码。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

因此,只需使您的文档名称具有唯一性:

  • 在数据库中插入新记录
  • 获取唯一ID
  • 使用此ID创建文件,将给定的名称和ID放在一起

选择文档名称时,您可以

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

它类似于Stackoverflow创建问题网址的方式:

/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/仍有效

答案 1 :(得分:-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
    }
}