使用sql语法为具有null或任何其他值的特定行更新单个blob列

3z6pesqy  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(349)

我有两个相同的表(列计数、名称和设置)。我有一个相同的行在每个表上,相同的信息。其中一列是 BLOB 键入列并包含图像(bmp)。
两个行/表都有一个 id 列, auto increment ,因此两个表中的每一行的id都是相同的。列设置为 blob 类型可以是 NULL (已设置)。
我用的是 action 具有以下查询的:

dbmodule.arhivaQuery.SQL.Clear;
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name`=deleted WHERE `id`=''' + inttostr(dbmodule.comenziDataSetid.Value) + ''';');
dbmodule.arhivaQuery.ExecSql(true);

理论上,这应该通过从blob列中删除bmp来更新第二个表中的行,或者更确切地说,用单词“deleted”替换bmp。如果没有,图像仍在列/行中。
有几件事需要澄清:
dbmodule是包含数据集、数据源、sql连接和查询的数据模块的名称( TSimpleDataSet , TDataSource , TSQLConnection , TSQLQuery ).
arhivaquery是我正在使用的查询的名称(a) TSQLQuery )column_name=列的名称,我已经在这个粘贴中编辑了,这样您可以得到更清晰的图片。
您注意到,在最后,我使用第一个表中的行的id来更改第二个表中的数据,这就是为什么会出现这种情况(两个表中的行的id是相同的)。
当我执行这个命令时,它应该在两个表中都保留这两行,但是只更新第二个表中的行,方法是从blob列中删除它的映像。所以在这之后我应该 row 在第一个 table 图像在blob列中,第二个表中的同一行在blob列中没有图像。
我猜我的sql语法是错误的(有一些警告也这么说),有人能帮我改正吗?

dfuffjeb

dfuffjeb1#

如果要清除blob字段的内容,请将其赋值为null。

dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`=''' + inttostr(dbmodule.comenziDataSetid.Value) + ''';');

如果要为那些没有值的列显示“已删除”,请在 SELECT 语句检索内容时使用 IFNULL() 或者 COALESCE() ,以dbms支持的为准。
您可以做的另一个改进(既可以简化编码,又可以防止sql注入)是停止连接sql,转而使用参数。这也意味着你可以停止所有的 ''' 双引号、三引号、四引号和数据类型转换,因为db驱动程序将为您处理所有这些。

dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`= :ID;');
// Use AsInteger, AsString, AsFloat, or AsBoolean, whichever fits your
// column data type. Notice no quotes, no call to IntToStr or FloatToStr.
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;

注意:一些db驱动程序需要 Params.ParamByName 相反。如果一个不行,另一个会。
最后,将您的sql长行分解为可管理的部分,这样您就可以停止所有的滚动来阅读它。

dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name`');
dbmodule.arhivaQuery.SQL.Add('SET `column_name` = NULL WHERE `id`= :ID;');
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;

相关问题