Обычно, когда у вас есть данные из строки в вашей базе данных во внешнем интерфейсе, у вас должны быть все значения, которые вы могли бы использовать для обновления этой строки в базе данных. Вы должны передать все эти значения в ваше обновление, независимо от того, изменились они или нет. В противном случае ваша база данных на самом деле не знает, получает ли она значение NULL для столбца, потому что это то, чем она должна быть, или потому что вы просто не передали действительное значение.
Если у вас есть области приложения, в которых вам не нужны определенные столбцы из таблицы, то можно настроить дополнительные хранимые процедуры, которые не используют эти столбцы. Однако зачастую проще извлечь все столбцы из базы данных при заполнении внешнего объекта. Накладные расходы на дополнительные столбцы обычно минимальны и требуют сохраненного обслуживания нескольких хранимых процедур обновления.
Вот пример. Это синтаксис MS SQL Server, поэтому вам, возможно, придется немного его изменить, но, надеюсь, это иллюстрирует идею:
CREATE PROCEDURE Update_My_Table
@my_table_id INT,
@name VARCHAR(40),
@description VARCHAR(500),
@some_other_col INT
AS
BEGIN
UPDATE
My_Table
SET
name = @name,
description = @description,
some_other_col = @some_other_col
WHERE
my_table_id = @my_table_id
END
CREATE PROCEDURE Update_My_Table_Limited
@my_table_id INT,
@name VARCHAR(40),
@description VARCHAR(500)
AS
BEGIN
UPDATE
My_Table
SET
name = @name,
description = @description
WHERE
my_table_id = @my_table_id
END
Как видите, просто удалите те столбцы, которые вы не обновляете, из оператора UPDATE. Только не переусердствуйте и попробуйте создать хранимую процедуру для каждой возможной комбинации столбцов, которые вы, возможно, захотите обновить. Гораздо проще просто получить дополнительные столбцы из БД, когда вы выбираете из таблицы в первую очередь. В итоге вы вернете то же значение, и ваш сервер обновит столбец с таким же точным значением, но это не имеет большого значения. Вы можете написать свой интерфейс, чтобы убедиться, что хотя бы один столбец изменился, прежде чем он действительно попытается что-либо обновить в базе данных.