SQLite会覆盖我现有的记录:C ++

时间:2014-06-29 09:52:02

标签: c++ sqlite

我是SQLite的新手,我可能会遗漏一些非常基本的东西。我正在创建一个如下所示的表,并带有以下语句。

创建表语句

std::string strQuery = "CREATE TABLE IF NOT EXISTS ";
    strQuery += tableNames[msgTable];
    strQuery += " (RecKey INTEGER PRIMARY KEY, Origin TEXT NOT NULL, Type INT, Target INT, Header TEXT NOT NULL, Content TEXT)";

然后我使用以下语句插入记录。

插入声明

std::string appendRecStr = "INSERT INTO " + tableNames[msg._type] + " (RecKey, Origin, Type, Target, Header, Content) VALUES (";
    appendRecStr +=  std::string("NULL") + ", " +
                     AddQuote4SQL(msg._orig) +", " + 
                     AddQuote4SQL((short)msg._type) +", " + 
                     AddQuote4SQL((short)msg._target) +", " + 
                     AddQuote4SQL(msg._head) +", " + 
                     AddQuote4SQL(msg._data) + ");";

此外,

    inline std::string AddQuote4SQL( const std::string & s ) {return std::string("'") + s + 
    std::string("'");}
inline std::string AddQuote4SQL( short s ) 
    {
        std::stringstream ss;
        ss << "'" << std::to_string(s) << "'";
        return ss.str();
    }

问题是insert语句会覆盖现有记录。出了什么问题?

1 个答案:

答案 0 :(得分:-1)

我认为你遗漏了一些关于sql的基本知识。 INSERT语句始终插入新行。在这种情况下你想要的是一个UPDATE语句,它使用一定的值来识别它的副本(即column1 =“somevalue”:下面)。如果找不到与该值匹配的行,则应插入,因为不存在重复项。请参阅以下代码:

UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
    INSERT INTO Table1 VALUES (...)