Изменяет исходные записи Таблицы соответствущими откорректированными данными.

NoteПримечание

Команда SQL UPDATE может изменить данные только в записях одной Таблицы.

UPDATE Target
SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]
[FROM [FORCE] Table_List_Item [[, ...] | [JOIN [ Table_List_Item]]]
WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

Параметры

UPDATE Target

Определяет имя Базовой Таблицы, Курсора, алиаса Таблицы или Курсора, или имя файла, где выполняются требуемые изменения. Вы можете указать несколько источников данных для операции изменения в соответствующей секции FROM. Target может иметь один из следующих возможных вариантов синтаксиса:

  • [DatabaseName!]TableName

    DatabaseName! определяет имя базы данных, к которой прикреплена соответствующая таблица, если она (таблица) не закреплена за текущей базой данных. Если рассматриваемая таблица не относится к текущей базе данных, вы должны обязательно указать имя родительской базы данных. В качестве разделителя-соединителя между именем родительской базы данных и именем дочерней таблицы используется восклицательный знак (!).

    TableName определяет имя таблицы, в которой выполняются изменения.

  • Alias

    Alias определяет имя алиаса соответствующей таблицы, в которой выполняются изменения данных из источников, которые задаются в секции FROM.

  • FileName

    FileName определяет имя файла, в котором выполняются рассматриваемые изменения данных.

SET Column_Name1= eExpression1 [, Column_Name2 = eExpression2 ...]

Определяет имя столбца в изменяемой таблице, в который заносятся новые значения. Если вы не используете секцию WHERE, каждая запись таблицы назначения будет содержать новые значения указанных столбцов.

Если вы хотите использовать значения некоторых свойств объекта исходных данных в качестве expression, вы должны определить соответствующую переменную памяти для указанного объекта, а за тем ее использовать. Например, вы можете выполнить следующее x = oColField("iid").Value и, после этого, указавать конструкцию SET как set iid = x, в рассматриваемой команде UPDATE - SQL . Если вы используете следующую нотацию при обращении к свойствам объекта objectname.property, непосредственно в выражении expression, то в этом случае возникает Ошибочная ситуация; отсутствие указанного Алиаса objectname.

В качестве выражения в конструкции SETможно использовать некоторый Подзапрос, возвращающий требуемое выражение. Если выполняемый подзапрос не возвращает никакого результата, то предполагается значение = NULL. Общий синтаксис и дополнительная информация о Подзапросах представлена в следующем разделе SELECT - SQL, команда - FROM, секция.

NoteОбратите внимание

Если вы используете Подзапрос в секции SET, тогда вы не можете использовать Подзапрос в секции WHERE. Подзапросы в секции SET должны удовлетворять тем же условиям, как и в конструкциях сравнения или соединения.

[FROM [FORCE] Table_List_Item[[, ...] | [JOIN [ Table_List_Item]]]

Определяет одну или несколько таблиц данных для выполнения операции Изменения данных.

Секция FROM имеет аналогичный синтаксис, как и в команде SQL SELECT, за исключением следующих ограничений:

  • Изменяемая Таблица или Курсор не может быть включена в качестве присоединяемой таблицы при соединении типа OUTER Join.

  • Данная операция изменения не должна "ломать" другие существующие Соединения JOIN, при выполнении операции Соединения  JOIN для изменяемой таблицы.

  • Результирующий Курсор не должен быть результатом выполнения Подзапроса.

Дополнительная информацию имеется в следующем разделе SELECT - SQL, Команда.

FORCE - определяет, что указанные присоединяемые таблицы обрабатываются в том порядке, в котором они указаны в секции FROM.

NoteОбратите Внимание

Если опция FORCE - отсутствует, Visual FoxPro пытается оптимизировать выполнение рассматриваемой операции Изменения. Однако, Операция Изменения данных может выполняться значительно быстрее при использовании ключевого слова FORCE, в этом слечае система Visual FoxPro отключает оптимизацию операции Изменения.

Table_List_Item может иметь следующий Синтаксис:

  • [DatabaseName!]Table [[AS] Local_Alias]

    DatabaseName! определяет имя базы данных, к которой прикреплена таблица исходных данных, и она (таблица) не закреплена к текущей (открытой) базе данных. Если таблица исходных данных не входит в текущую базу данных, вы должны указать имя родительской базы данных. В качестве разделителя между именами родительской базой данных и дочерней таблицей используется восклицательный знак (!). 

    Tableопределяет имя таблицы исходных данных для проведения операции Изменения. Если указанная таблица не открыта, тогда система Visual FoxPro отображает системный дталоговый бокс Открытия требуемой таблицы, для выбора необходимого файла. После открытия указанной таблицы она остается открытой после выполнения рассматриваемой операции.

    Local_Alias определяет локальный (внутренний) алиас исходной таблицы Table. Если вы используете локальный алиас для конкретной таблицы, вы должны всюду, в рамках команды UPDATE, использовать данный алиас при ссылке на эту таблицу. Локальный алиас может использоваться как для таблиц, так и для Курсоров. 

    Конструкция JOIN обеспечивает задание одной или нескольких присоединяемых исходных таблиц данных для операции Изменения. Нет существенных ограничений по лимитированию количества таблиц или курсоров присоединяемых секцией JOIN в одной команде UPDATE.

  • (Subquery) AS Subquery_Alias

    Определяет некоторый Подзапрос в виде стандартного оператора SELECT, который является другим оператором выборки SELECT.  Дополнительная информацию по использованию Подзапросов в стандартных операторах  SELECT представлена при описании секции FROM в разделе: SELECT - SQL, Команда.

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]

Определяет одно или несколько Условий Критерия Фильтра, который отбирает удовлетворяющие записи, в которые вносятся изменения, новые значения полей. В рассматриваемой команде не ограничивается количество логических выражений, указываемых в секции WHERE .

Для отрицания логического выражения применяется логический операнд NOT. Для проверки пустого значения некоторого поля используется функция EMPTY( ). Смотрите дополнительную информацию в разделе: EMPTY( ), функция.

Expand imageКомментарии

После выполнения команды Изменения данных, количество изменненых записей помещается в системную переменную _TALLY . Смотрите дополнительно раздел: _TALLY, системная переменная.

NoteСовет

Когда выполняется Изменение нескольких записей в Таблице, открытой для коллективного доступа к Данным (shared access), команда SQL UPDATE использует последовательно механизм блокировки изменяемых Записей, в отличие от работы команды REPLACE. Данный подход позволяет уменьшить конкуренцию в многопользовательской среде и повышает скорость обработки Запроса на Изменение. Для максимальной надежности откройте изменяемую таблицу в Монопольном (exclusive) режиме или используйте функцию блокирования файла таблицы: FLOCK( ). Смотри дополнительно раздел: FLOCK( ), функция.

В секции SET указанные операторы Изменения данных система Visual FoxPro выполняет в обычной последовательности. Например, если вы используете следующую команду:  UPDATE table1 SET field1 = field2, field2=field1, значения указанных полей не изменяются, значения для обоих полей являются одинаковыми.

Expand imageНаследуемые примеры Программного Кода

Пример 1

В следующем примере используется команда OPEN DATABASE - для открытия соответствующей тестовой базы данных Visual FoxPro; команда USE  - для открытия таблицы Customer, из TestData.dbc. Команда SQL UPDATE изменяет все записи в указанной таблице; осуществляется Изменение поля MaxOrdAmt field = 25.

  CopyCode imageКопировать Код
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
USE Customer
UPDATE Customer SET MaxOrdAmt = 25
BROWSE FIELDS Company, MaxOrdAmt

Смотрите дополнительно разделы: USE, команда и BROWSE, команда.

Пример 2

В следующем примере: с помощью команды OPEN DATABASE открывается тестовая база данных Visual FoxPro; TestData.dbc. Команда SQL SELECT выполняет выборку требуемых данных из таблицы Products, из открытой базы данных TestData.dbc, результаты размещаются в новой таблице с именем MyProductsList, отображаются в системном окне Browse.

С помощью команды CREATE CURSOR - создается новый курсор MyUpdateTable, в который добавляется новая запись со значение поля Prod_Unit = 10; данные также отображаются в окне Browse.

В команде SQL UPDATE выполняется изменение поля In_Stock, из таблицы MyProductsList новым значением из созданного курсора MyUpdateTable, для тех записей, для которых выполняется условие product name = "Chai". Далее: выполняется выборка измененных записей и результаты отображаются в системном окне Browse, смотри последний оператор SQL SELECT .

  CopyCode imageКопировать Код
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT in_stock, prod_name ;
FROM Products ;
INTO TABLE MyProductsList.dbf
BROWSE
CREATE CURSOR MyUpdateTable (prod_unit I(10))
INSERT INTO MyUpdateTable (prod_unit) VALUES (10)
BROWSE
UPDATE MyProductsList ;
SET MyProductsList.in_stock = MyUpdateTable.prod_unit ;
FROM MyUpdateTable ;
WHERE MyProductsList.prod_name = "Chai"
SELECT * FROM MyProductsList

Смотри дополнительные разделы: OPEN DATABASE, команда, BROWSE, команда, CREATE CURSOR - SQL, команда, и INSERT - SQL, команда .

Expand imageПримеры Программного Кода

Пример 3

В следующем примере демонстрируется использование Подзапроса, как вычисляемого выражения, которое заносится в соответствующее поле, секция SET. В рассматриваемом Запросе изменяются все записи в таблице Products. Вычисление требуемого значения осуществляется согласно следующему условию: связываются исходные таблицы, по указанному полю productID и для которых выполняется указанное условие. 

  CopyCode imageКопировать Код
UPDATE products ;
SET unitprice = ;
(SELECT (msrp*.90) ;
FROM mfg_msrp ;
WHERE mfg_msrp.productID = products.productID ;
AND mfg_msrp.discontinued = .f.)

Пример 4

В следующем далее примере демонстрируется использование Корреляционного (зависимого) Изменения для заданного сложного условия отбора записей, которое существенно отличается от условия из примера 3.

  CopyCode imageКопировать Код
UPDATE products ;
SET unitprice = mfg_msrp.msrp*.90 ;
FROM mfg_msrp ;
WHERE mfg_msrp.productID = products.productID;
AND mfg_msrp.discontinued = .f.

Пример 5

В представленном далее примере демонстрируется тот факт, что при корреляционном изменении используется только первая найденная запись источника данных для изменения, по указанному критерию отбора. Остальные записи игнорируются. В представленном примере создается два временных Курсора. Первый используется для проведения изменений. Второй курсор используется для хранения новых значений, которые будут вноситься в первый курсор. В этом курсоре хранятся данные, которые будут использоваться для изменения: две первых записи - удовлетворяют критерию отбора; третья запись - не соответствует; четвертая запись отбрасывается, так как совпадает по коду с первой записью ProdID =1? rjnjhfz e;t bcgjkmpetncz.

  CopyCode imageКопировать Код
CLOSE DATABASES ALL 
CREATE CURSOR MyProducts (ProdID I , ProdCategory I NULL, MSRP Y NULL)
INSERT INTO MyProducts VALUES (1,9,1.00)
INSERT INTO MyProducts VALUES (2,8,2.00)
INSERT INTO MyProducts VALUES (3,7,3.00)

CREATE CURSOR MyUpdates (ProdID I , MSRP Y)
INSERT INTO MyUpdates VALUES (1,.50) && Matches and updates.
INSERT INTO MyUpdates VALUES (2,20.00) && Matches and updates.
INSERT INTO MyUpdates VALUES (4,40.00) && No match
INSERT INTO MyUpdates VALUES (1,10.00)&& 2nd match but no update.

UPDATE MyProducts SET MSRP=MyUpdates.MSRP FROM MyUpdates WHERE MyProducts.ProdID=MyUpdates.ProdID
SELECT MyProducts BROWSE

Expand imageСм. также