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

Update a single BLOB column for a specific row with a Null or any other value using a sql syntax

我有 2 个相同的 table(列数、名称和设置)。 我在每个 table 上有 1 个相同的行,相同的信息。 其中一列是 BLOB 类型的列并包含图像 (bmp)。

两行/tables 都有一个 id 列,auto increment,所以 id 在两个 tables 中的每一行都是相同的。 设置为 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 来更新第二个 table 中的行,或者更确切地说,用单词 "deleted" 替换 bmp。不是,图像还在列/行中。

有几点需要澄清:

dbmodule 是包含数据集、数据源、sql 连接和查询的数据模块的名称。 (TSimpleDataSet, TDataSource, TSQLConnection, TSQLQuery).

arhivaQuery 是我正在使用的查询的名称 (a TSQLQuery) column_name = 列的名称,我已在此粘贴中进行了编辑,以便您获得更清晰的图片。

你注意到最后我使用第一个 table 中的行的 ID 来更改第二个中的数据,所以这就是为什么(两个 [=] 中的行的 ID 相同49=]s).

当我执行此操作时,它应该将两行都保留在两个 table 中,但仅通过从 blob 列中删除其图像来更新第二个 table 中的行。 因此,在此之后我应该在第一个 table 中有 row,在 blob 列中有图像,在第二个 table 中有相同的行,在 blob 列中没有图像。

我猜我的 sql 语法有误(也收到了一些警告),有人可以帮我改正吗?

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

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

如果要为那些没有值的列显示 deleted,请在使用 IFNULL() 或检索内容时在 SELECT 语句中执行此操作COALESCE(),以您的 DBMS 支持为准。

您可以做的另一项改进(既为了简化编码又为了防止 SQL 注入)是 停止 连接您的 SQL 并切换到使用参数。这也意味着您可以停止所有 ''' double/triple/quadruple 引用废话和数据类型转换,因为数据库驱动程序将为您处理所有这些。

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;

注意: 某些数据库驱动程序将需要 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;