我是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语句会覆盖现有记录。出了什么问题?
答案 0 :(得分:-1)
我认为你遗漏了一些关于sql的基本知识。 INSERT语句始终插入新行。在这种情况下你想要的是一个UPDATE语句,它使用一定的值来识别它的副本(即column1 =“somevalue”:下面)。如果找不到与该值匹配的行,则应插入,因为不存在重复项。请参阅以下代码:
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
IF @@ROWCOUNT=0
INSERT INTO Table1 VALUES (...)