sqlite 调用update 语句时,假如记录不存在,会怎么样?

时间:2022-10-22 23:06:07
sqlite 调用update 语句时,假如记录不存在,会怎么样?

是返回一个错误,还是自动添加该记录但全部属性为空?

我现在update一个不存在的记录,他不返回错误,但读又没读到数据

18 个解决方案

#1


查看sqlte Update执行的sql语句返回值先看看...

#2


引用 1 楼 oyljerry 的回复:
查看sqlte Update执行的sql语句返回值先看看...


是0,即SQLITE_OK

#3


假如不用update,改为insert

后面的读程序是可以将数据读出来的

#4


是成功的,如果你不放心,可以用replace语句

#5


引用 4 楼 hendriclee 的回复:
是成功的,如果你不放心,可以用replace语句


我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了

#6


Update的sql语句是否正确...

#7




//创建并打开文件
MySQLite *sqlite = new MySQLite;
sqlite->sqlite_connect(TEST_FILE);

Sleep(100);

//建立一张表
std::string str_sql = "CREATE TABLE ";
str_sql += TEMP_TABLE;
str_sql += "(name VARCHAR, data blob);";

bool b = sqlite->sqlite_exec(str_sql.c_str());
assert_exp(b == true);

//------------------------------------------------------------------------------------
//写数据

//把一个 sql 语句解析到 stat 结构里去
sqlite3_stmt *stat;
std::string table_name = TEMP_TABLE;
std::string line_name = "san";
str_sql = "UPDATE '" + table_name + "' SET data = ? WHERE name = '" + line_name + "';";


int result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat, 0 );
assert_exp(result == SQLITE_OK && stat != NULL );

        //将结构体转化为二进制字符串流
st_tb  tb;
tb.a = 5;
std::string str_binary = ToStringEasyBin(tb);


//开始插入二进制数据
int back = sqlite3_bind_blob( stat, 1, str_binary.c_str(), str_binary.length(), NULL ); 
//保存到数据库里
result = sqlite3_step( stat );
//释放结构
sqlite3_finalize( stat ); 

//------------------------------------------------------------------------------------
//读数据

sqlite3_stmt * stat1;
str_sql = "select * from ";
str_sql += TEMP_TABLE;
result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat1, 0 );
assert_exp(result == SQLITE_OK );

result = sqlite3_step( stat1 );
if (result != SQLITE_ROW)
{
std::cout<< "fail"<<endl;
return 0;
}

const void *content = sqlite3_column_blob( stat1, 1 );
        int len = sqlite3_column_bytes( stat1, 1 );

char *src = (char*)content;
std::string desc(src,len);

        //将字符串流转化为原结构
st_tb tb1;
ToStructEasyBin(desc,tb1);

//把刚才分配的内容析构掉 
sqlite3_finalize( stat1 );

#8


写数据时str_sql 的值为

UPDATE 'table0' SET data = ? WHERE name = 'san';

#9


UPDATE \"table0\" SET data = ? WHERE name = \'san\';

#10


引用 5 楼 san_77227487 的回复:
引用 4 楼 hendriclee 的回复:
是成功的,如果你不放心,可以用replace语句


我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了


REPLACE语句的用途是,如果记录存在,就UPDATE,如果记录不存在,就INSERT

#11


谢谢大家   我试一试先

#12


用replace好象还是不行,新建时可以,但再调用一次来修改数据时就不行了.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.

#13


另外,我已确定我的INSERT UPDATE 和 select 语句没有错误

因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的

#14


没有错误,也不增加记录,如果你用Execute执行SQL语句的话,通过第二个参数“参数RecordsAffected是操作完成后所影响的行数,”判断影响的行数来判断执行情况,如果为0说明一行都未更新

#15


明白了,原来是因为数据库建表时没有指定primary key, 所以replace语句不正常. 
问题已解决,谢谢大家

#16


有没有办法查看某条记录是否存在,如表中有字段:RecordID RecordName,如果我想看是否存在RecordName='record_one'的记录是否存在,什么函数或函数组合比较好呢?

#17


学习一下。

#18


replace

#1


查看sqlte Update执行的sql语句返回值先看看...

#2


引用 1 楼 oyljerry 的回复:
查看sqlte Update执行的sql语句返回值先看看...


是0,即SQLITE_OK

#3


假如不用update,改为insert

后面的读程序是可以将数据读出来的

#4


是成功的,如果你不放心,可以用replace语句

#5


引用 4 楼 hendriclee 的回复:
是成功的,如果你不放心,可以用replace语句


我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了

#6


Update的sql语句是否正确...

#7




//创建并打开文件
MySQLite *sqlite = new MySQLite;
sqlite->sqlite_connect(TEST_FILE);

Sleep(100);

//建立一张表
std::string str_sql = "CREATE TABLE ";
str_sql += TEMP_TABLE;
str_sql += "(name VARCHAR, data blob);";

bool b = sqlite->sqlite_exec(str_sql.c_str());
assert_exp(b == true);

//------------------------------------------------------------------------------------
//写数据

//把一个 sql 语句解析到 stat 结构里去
sqlite3_stmt *stat;
std::string table_name = TEMP_TABLE;
std::string line_name = "san";
str_sql = "UPDATE '" + table_name + "' SET data = ? WHERE name = '" + line_name + "';";


int result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat, 0 );
assert_exp(result == SQLITE_OK && stat != NULL );

        //将结构体转化为二进制字符串流
st_tb  tb;
tb.a = 5;
std::string str_binary = ToStringEasyBin(tb);


//开始插入二进制数据
int back = sqlite3_bind_blob( stat, 1, str_binary.c_str(), str_binary.length(), NULL ); 
//保存到数据库里
result = sqlite3_step( stat );
//释放结构
sqlite3_finalize( stat ); 

//------------------------------------------------------------------------------------
//读数据

sqlite3_stmt * stat1;
str_sql = "select * from ";
str_sql += TEMP_TABLE;
result = sqlite3_prepare( sqlite->m_db, str_sql.c_str(), -1, &stat1, 0 );
assert_exp(result == SQLITE_OK );

result = sqlite3_step( stat1 );
if (result != SQLITE_ROW)
{
std::cout<< "fail"<<endl;
return 0;
}

const void *content = sqlite3_column_blob( stat1, 1 );
        int len = sqlite3_column_bytes( stat1, 1 );

char *src = (char*)content;
std::string desc(src,len);

        //将字符串流转化为原结构
st_tb tb1;
ToStructEasyBin(desc,tb1);

//把刚才分配的内容析构掉 
sqlite3_finalize( stat1 );

#8


写数据时str_sql 的值为

UPDATE 'table0' SET data = ? WHERE name = 'san';

#9


UPDATE \"table0\" SET data = ? WHERE name = \'san\';

#10


引用 5 楼 san_77227487 的回复:
引用 4 楼 hendriclee 的回复:
是成功的,如果你不放心,可以用replace语句


我主要是想实现这样的功能: 先update, 如果发现不存在的话,就改用insert

但他返回成功的话,我不知道怎么做判断了


REPLACE语句的用途是,如果记录存在,就UPDATE,如果记录不存在,就INSERT

#11


谢谢大家   我试一试先

#12


用replace好象还是不行,新建时可以,但再调用一次来修改数据时就不行了.
貌似他的知已经存在这个记录时就直接退出,不会做任何操作.

#13


另外,我已确定我的INSERT UPDATE 和 select 语句没有错误

因为我通过先INSER 后 UPDATE 的方法是可以正常插入和修改数据的

#14


没有错误,也不增加记录,如果你用Execute执行SQL语句的话,通过第二个参数“参数RecordsAffected是操作完成后所影响的行数,”判断影响的行数来判断执行情况,如果为0说明一行都未更新

#15


明白了,原来是因为数据库建表时没有指定primary key, 所以replace语句不正常. 
问题已解决,谢谢大家

#16


有没有办法查看某条记录是否存在,如表中有字段:RecordID RecordName,如果我想看是否存在RecordName='record_one'的记录是否存在,什么函数或函数组合比较好呢?

#17


学习一下。

#18


replace