Обновление статистик
MS SQL Server строит план запроса на основании статистической информации о распределении значений в индексах и таблицах. Статистическая информация собирается на основании части (образца) данных и автоматически обновляется при изменении этих данных. Иногда этого оказывается недостаточно для того, что MS SQL Server стабильно строил наиболее оптимальный план выполнения всех запросов.
В этом случае возможно проявление проблем с производительностью запросов. При этом в планах запросов наблюдаются характерные признаки неоптимальной работы (неоптимальные операции).
Для того, чтобы гарантировать максимально правильную работу оптимизатора MS SQL Server рекомендуется регулярно обновлять статистики базы данных MS SQL.
Для обновления статистик по всем таблицам базы данных необходимо выполнить следующий SQL запрос:
exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'
Обновление статистик не приводит к блокировке таблиц, и не будет мешать работе других пользователей. Статистика может обновляться настолько часто, насколько это необходимо. Следует учитывать, что нагрузка на сервер СУБД во время обновления статистик возрастет, что может негативно сказаться на общей производительности системы.
Оптимальная частота обновления статистик зависит от величины и характера нагрузки на систему и определяется экспериментальным путем. Рекомендуется обновлять статистики не реже одного раза в день.
Приведенный выше запрос обновляет статистики для всех таблиц базы данных. В реально работающей системе разные таблицы требуют различной частоты обновления статистик. Путем анализа планов запроса можно установить, какие таблицы больше других нуждаются в частом обновлении статистик, и настроить две (или более) различных регламентных процедуры: для часто обновляемых таблиц и для всех остальных таблиц. Такой подход позволит существенно снизить время обновления статистик и влияние процесса обновления статистики на работу системы в целом.
Настройка автоматического обновления статистик (MS SQL 2005)
Запустите MS SQL Server Management Studio и подключитесь к серверу СУБД. Откройте папку Management и создайте новый план обслуживания:
Создайте субплан (Add Subplan) и назовите его «Обновление статистик». Добавьте в него задачу Update Statistics Task из панели задач:
Настройте расписание обновления статистик. Рекомендуется обновлять статистики не реже одного раза в день. При необходимости частота обновления статистик может быть увеличена.
Настройте параметры задачи. Для этого следует два раза кликнуть на задачу в правом нижнем углу окна. В появившейся форме укажите имя базу данных (или несколько баз данных) для которых будет выполняться обновление статистик. Кроме этого вы можете указать для каких таблиц обновлять статистики (если точно неизвестно, какие таблицы требуется указать, то устанавливайте значение All).
Обновление статистик необходимо проводить с включенной опцией Full Scan.
Сохраните созданный план. При наступлении указанного в расписании срока обновление статистик будет запущено автоматически.
Пример обновления таблицы данными из другой таблицы
Рассмотрим пример UPDATE, который показывает, как обновить таблицу данными из другой таблицы в MySQL.
MySQL
UPDATE customers
SET city = (SELECT city
FROM suppliers
WHERE suppliers.supplier_name = customers.customer_name)
WHERE customer_id > 5000;
1 |
UPDATEcustomers SETcity=(SELECTcity FROMsuppliers WHEREsuppliers.supplier_name=customers.customer_name) WHEREcustomer_id>5000; |
В этом примере UPDATE будет обновляться только таблица customers для всех записей, где customer_id больше 5000. Когда supplier_name из таблицы suppliers совпадает с именем customer_name из таблицы customers, city из таблицы suppliers будет скопирован в поле city таблицы customers.
Практическое упражнение № 1:
На основании таблицы suppliers заполненной следующими данными, обновите city на ‘Denver’ для всех записей, чьё supplier_name является ‘INTEL’.
Oracle PL/SQL
CREATE TABLE suppliers
( supplier_id number(10) not null,
supplier_name varchar2(50) not null,
city varchar2(50),
CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5001, ‘Microsoft’, ‘Chicago’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5002, ‘INTEL’, ‘Chicago’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5003, ‘Red Hat’, ‘Detroit’);
INSERT INTO suppliers (supplier_id, supplier_name, city)
VALUES (5004, ‘NVIDIA’, ‘New York’);
1 |
CREATETABLEsuppliers supplier_namevarchar2(50)notnull, cityvarchar2(50), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5001,’Microsoft’,’Chicago’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5002,’INTEL’,’Chicago’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5003,’Red Hat’,’Detroit’); INSERTINTOsuppliers(supplier_id,supplier_name,city) VALUES(5004,’NVIDIA’,’New York’); |
Решение для практического упражнения № 1:
Следующий оператор UPDATE будет выполнять это обновление в Oracle.
Oracle PL/SQL
UPDATE suppliers
SET city = ‘Denver’
WHERE supplier_name = ‘INTEL’;
1 |
UPDATEsuppliers SETcity=’Denver’ WHEREsupplier_name=’INTEL’; |
Таблица suppliers будет выглядеть следующим образом:
SUPPLIER_ID | SUPPLIER_NAME | CITY |
---|---|---|
5001 | Microsoft | Chicago |
5002 | INTEL | Denver |
5003 | Red Hat | Detroit |
5004 | NVIDIA | New York |
Как мы обычно меняем записи регистров сведений?
1С с записями баз данных работает вполне сносно, особенно если это набор записей того или иного регистра. Если записей немного, то для их изменения вполне годится чтение набора записей, заполнение нужной колонки и запись изменившихся данных. Т.е. примерно так:
Набор = РегистрыСведений.КакойТоРегистрСведений.СоздатьНаборЗаписей(); Набор.Отбор.Реквизит.Значение = ЗначениеФильтра; Набор.Отбор.Реквизит.Использование = Истина; Набор.Прочитать(); Для Каждого Ст ИЗ Набор Цикл Набор.НужнаяКолонка = НужноеЗначение; Набор.НоваяКлонка = Набор.КолонкаСоСтанымЗначением; КонецЦикла; Набор.Записать();
При существенном размере таблицы такой подход будет неоправдан. Для решения подобных задач программист часто пишет запрос, выбирая нужные записи для изменения, а потом через менеджер записи меняет оные в цикле. Как-то так:
Запрос = Новый Запрос( "ВЫБРАТЬ | НужнаяКолонка КАК НужнаяКолонка, | КолонкаСоСтанымЗначением КАК НоваяКлонка, | Реквизит, | Реквизит1, | Реквизит2 |ИЗ | РегистрыСведений.КакойТоРегистрСведений |ГДЕ | Реквизит = &ЗначениеОтбора"); Запрос.УстановитьПараметр("ЗначениеОтбора"); Для Каждого Ст ИЗ Запрос.Выполнить().Выгрузить() Цикл Запись = РегистрыСведений.КакойТоРегистрСведений.СоздатьМенеждерЗаписи(); ЗаполнитьЗначенияСвойств(Запись, Ст); Запись.Записать(); КонецЦикла;
Это уже работает куда медленнее. Можно, конечно, распараллелить процесс с помощью фоновых заданий, но тут уже трудоемкость становится неадекватна решаемой задаче (хотя, если у вас есть подсистема мультипоточного вычисления, то трудоемкость оказывается не сильно выше).
Синтаксис
Синтаксис для оператора UPDATE при обновлении таблицы в SQL.
UPDATE table
SET column1 = expression1,
column2 = expression2,
…
;
Или
Синтаксис SQL оператора UPDATE при обновлении таблицы данными из другой таблицы:
UPDATE table1
SET column1 = (SELECT expression1
FROM table2
WHERE conditions)
;
Или
Синтаксис SQL оператора UPDATE при обновлении нескольких таблиц (не разрешен в Oracle):
UPDATE table1, table2, …
SET column1 = expression1,
column2 = expression2,
…
WHERE table1.column = table2.column
;
Параметры или аргументы
- column1, column2
- Столбцы, которые вы хотите обновить
- expression1, expression2
- Это новые значения, назначаемые column1, column2. Поэтому column1 будет присвоено значение expression1, а column2 будет присвоено значение expression2 и т.д.
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены, чтобы выполнить обновление. Если никаких условий не предусмотрено, то все записи в таблице будут обновлены
Пример — обновить несколько столбцов
Давайте рассмотрим пример UPDATE, который показывает, как обновить более одного столбца в таблице.Подсказка:. Когда вы обновляете несколько столбцов в выражении UPDATE, вам нужно разделить запятыми пары столбец / значение в предложении SET.
В этом примере UPDATE у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Теперь давайте продемонстрируем, как использовать оператор UPDATE для обновления более одного значения столбца одновременно. Введите следующую команду UPDATE.
PgSQL
UPDATE suppliers
SET supplier_id = 150,
supplier_name = ‘Apple’,
city = ‘Cupertino’
state = ‘California’
WHERE supplier_name = ‘Google’;
1 |
UPDATEsuppliers SETsupplier_id=150, supplier_name=’Apple’, city=’Cupertino’ state=’California’ WHEREsupplier_name=’Google’; |
Будет обновлена 1 запись. Снова выберите данные из таблицы suppliers:
PgSQL
SELECT *
FROM suppliers;
1 |
SELECT* FROMsuppliers; |
Вот результаты, которые вы должны получить.
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
150 | Apple | Cupertino | California |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
В этом примере UPDATE будет обновлено значение supplier_id до 150, для supplier_name — ‘Apple’, для city — ‘Cupertino’, а для state — ‘California’, где supplier_name это «Google».
Рабочий пример:
Допустим, мы решили добавить в документ сумму для того, чтобы отображать ее в журналах и отчетах без необходимости лезть за ней каждый раз в табличную часть. При стандартном подходе мы можем собрать суммы по всем документам с помощью хзапроса, а потом в цикле установить данную сумму в нужный реквизит документа, после чего придется этот документ записать. Возможно из-за этого программисты и не спешат производить такие изменения. С помощью SQL данная проблема решается за минуты примерно вот так:
Дано:
- Документ «КакойТоДокумент», таблица SQL «_Document55»;
- Поле, в которую нужно записать сумму «_Fld12507»;
- Табличная часть «_Document55_VT172»;
- Поле табличной части, содержащее сумму «_Fld749»
Итак, давайте напишем скриптик для SQL, который все, что нам нужно, сделает за считанные минуты даже если у нас не одна сотня тысяч документов:
UPDATE _Document55 SET _Fld12507 = SUM(t2._Fld749) FROM _Document55 AS t1 LEFT JOIN _Document55_VT172 AS t2 ON t1._IDRef = t2._Document55_IDRRef GROUP BY t1._IDRef
Собственно, все.
Что мы тут написали?
Описание инструкции UPDATE в T-SQL
UPDATE – инструкция SQL, с помощью которой происходит изменение существующих данных в таблицах.
Важные моменты:
- Если инструкция UPDATE, т.е. обновление строк, нарушает какое-нибудь ограничение или правило, или новое значение имеет несовместимый тип данных (хотя бы для одной строки), то возникнет ошибка и все изменения отменяются, никакие строки не обновляются;
- По умолчанию инструкция UPDATE получает монопольную блокировку на целевую таблицу, которую она изменяет, это означает, что пока одна инструкция UPDATE выполняется, т.е. изменяет данные в таблице, другие инструкции не могут изменять данные в этой таблице;
- Чтобы использовать инструкцию UPDATE, нужны соответствующие разрешения на изменение данных, а также на чтение данных, если инструкция содержит условие WHERE;
- Если Вам нужно узнать количество строк, которые Вы обновили инструкцией UPDATE, например, для возврата в клиентское приложение или для любых других целей, то для этого Вы можете использовать функцию @@ROWCOUNT.
Упрощенный синтаксис UPDATE
Синтаксис UPDATE достаточно большой, и начинающим понять его сложно, поэтому, для того чтобы было проще понять логику формирования инструкции UPDATE, я приведу упрощенный синтаксис.
UPDATE Целевая таблица SET Имя столбца = Значение
FROM Таблица источник
WHERE Условие
Где
- UPDATE – инструкция обновления;
- Целевая таблица – таблица, данные в которой необходимо изменить;
- SET – команда, которая задает список обновляемых столбцов. Каждый следующий столбец указывается через запятую;
- Имя столбца – столбец, в котором расположены данные, которые необходимо изменить;
- Значение – новое значение, на которое необходимо изменить значение столбца. Можно указывать как конкретное значение, так и расчётное выражение, функцию или подзапрос. Также можно указать ключевое слово DEFAULT, что будет означать, что столбцу необходимо присвоить значение по умолчанию;
- FROM – секция, которая указывает таблицу, из которой необходимо взять новое значение столбца. Секция может содержать объединение JOIN;
- Таблица источник – таблица, в которой расположено новое значение столбца;
- WHERE – условие отбора строк, подлежащих обновлению.
Обновите SQL Server до новой версии
Итак, начнем обновление!
Нажмите Далее, затем на следующем экране примите условия и нажмите Далее.
На следующих экранах просто нажмите «Установить» и убедитесь, что вы отметили флажок «Запуск» после завершения установки.
Как только установщик завершит весь процесс, мы перейдем к этой симпатичной панели с приятным приветственным сообщением. Вы знаете тип приветственных сообщений от Microsoft, которые становятся страшными ужасами наших кошмаров, поскольку они всегда напоминают нам о неудачных миграциях, долгих часах в офисе и так далее. Ну что ж, давайте двигаться дальше.
Теперь давайте начнем с нажатия кнопки «+» и выбора нашего сценария миграции. Как только вы нажмете эту кнопку, появится новое лезвие с некоторыми опциями.
Как видите, я выбираю «Оценка», вставляю имя любого проекта (у меня это 2014to2017, так как это то, чего мы пытаемся достичь), и я устанавливаю тип исходного и целевого сервера как SQL Server, поскольку все, что мы собираемся сделать, это линейное обновление.
Теперь давайте нажмем кнопку «Создать».
Как только мы нажмем «Создать», нам будет предоставлено три варианта выбора. Проверьте проблемы совместимости , которые будут нашим единственным выбором для этого обновления.
Оставьте рекомендацию о новых функциях без изменений, поскольку в настоящее время мы не заинтересованы в этом. Третий вариант применим в других сценариях в более старых версиях SQL и также неактивен, поскольку он не применим к нашему сценарию.
Как только мы нажимаем Далее, мы попадаем на экран, где нам нужно подключиться к серверу, который мы решили обновить. Поскольку мы обновляем сервер, к которому мы подключены, мы выберем localhost в качестве сервера и обязательно проверим « Сертификат доверенного сервера », чтобы не было неприятных ошибок, связанных с тем, что имя не является доверенным в домене и т.д.
Затем мы нажимаем Connect и, если соединение установлено успешно, нам будет предоставлен список всех баз данных в этом экземпляре SQL. В моем случае у меня есть тестовая база данных vpm, которую мы будем использовать при оценке.
Теперь мы нажимаем Добавить, а затем нажимаем Начать оценку.
Теперь мы просто дождемся окончания оценки.
Теперь, когда оценка завершена, и мы видим, что рядом с нашей БД установлен зеленый флажок, мы можем перейти на SQL Server 2017, зная, что ничего не сломается, и есть полная совместимость.
Теперь пришло время начать процесс обновления.
Я подключил ISO-стандарт SQL 2017 к моей машине. Теперь мы просто запускаем обычную настройку и выбираем Upgrade из предыдущей версии SQL Server.
Мы можем либо ввести наш серийный номер, либо выбрать «Оценка», в зависимости от наших текущих потребностей.
Затем мы удостоверимся, что работаем над правильным экземпляром.
На следующей странице у нас есть возможность выбрать и отменить выбор функций, которые мы хотим обновить.
На следующих экранах мы просто нажимаем «Далее» до тех пор, пока не перейдем к процессу обновления, дождемся его завершения и все готово!
Подзапросы SQL с инструкцией INSERT
Инструкция INSERT может использоваться с подзапросами SQL.
Синтаксис:
INSERT INTO имя_таблицы ) ] SELECT FROM таблица1 ;
Если мы хотим вставить заказы из таблицы ‘orders‘, для которых в таблице «neworder» значение advance_amount составляет 2000 или 1500, можно использовать следующий код SQL:
Пример таблицы: orders
ORD_NUM ORD_AMOUNT ADVANCE_AMOUNT ORD_DATE CUST_CODE AGENT_CODE ORD_DESCRIPTION ---------- ---------- -------------- --------- --------------- --------------- ----------------- 200114 3500 2000 15-AUG-08 C00002 A008 200122 2500 400 16-SEP-08 C00003 A004 200118 500 100 20-JUL-08 C00023 A006 200119 4000 700 16-SEP-08 C00007 A010 200121 1500 600 23-SEP-08 C00008 A004 200130 2500 400 30-JUL-08 C00025 A011 200134 4200 1800 25-SEP-08 C00004 A005 200108 4000 600 15-FEB-08 C00008 A004 200103 1500 700 15-MAY-08 C00021 A005 200105 2500 500 18-JUL-08 C00025 A011 200109 3500 800 30-JUL-08 C00011 A010 200101 3000 1000 15-JUL-08 C00001 A008 200111 1000 300 10-JUL-08 C00020 A008 200104 1500 500 13-MAR-08 C00006 A004 200106 2500 700 20-APR-08 C00005 A002 200125 2000 600 10-OCT-08 C00018 A005 200117 800 200 20-OCT-08 C00014 A001 200123 500 100 16-SEP-08 C00022 A002 200120 500 100 20-JUL-08 C00009 A002 200116 500 100 13-JUL-08 C00010 A009 200124 500 100 20-JUN-08 C00017 A007 200126 500 100 24-JUN-08 C00022 A002 200129 2500 500 20-JUL-08 C00024 A006 200127 2500 400 20-JUL-08 C00015 A003 200128 3500 1500 20-JUL-08 C00009 A002 200135 2000 800 16-SEP-08 C00007 A010 200131 900 150 26-AUG-08 C00012 A012 200133 1200 400 29-JUN-08 C00009 A002 200100 1000 600 08-JAN-08 C00015 A003 200110 3000 500 15-APR-08 C00019 A010 200107 4500 900 30-AUG-08 C00007 A010 200112 2000 400 30-MAY-08 C00016 A007 200113 4000 600 10-JUN-08 C00022 A002 200102 2000 300 25-MAY-08 C00012 A012
Код SQL:
INSERT INTO neworder SELECT * FROM orders WHERE advance_amount in(2000,1500);
Результат:
9 ответов
Решение
Обратите внимание, скобки обязательны для операторов UPDATE:
746
2009-07-29 06:44
Без вся идея не имеет особого смысла. Вам необходимо иметь последовательное определение того, какое направление «вверх», а какое «вниз», чтобы концепция вершины имела смысл.
Тем не менее, SQL Server допускает это, но не гарантирует детерминированный результат.
синтаксис в принятом ответе не поддерживает предложение, но здесь можно получить детерминированную семантику, используя CTE или производную таблицу для определения желаемого порядка сортировки, как показано ниже.
323
2012-02-11 15:41
18
2009-12-17 06:12
Для тех, кто, как я до сих пор застрял с SQL Server 2000, может быть использован до запрос
ограничит обновление до 100 строк
Он устарел, по крайней мере, с SQL 2005, но с SQL 2017 он все еще работает. https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017
17
2013-09-10 20:40
Что еще круче, так это тот факт, что вы можете использовать встроенную табличную функцию для выбора, какой (и сколько через ) строки, чтобы обновить. То есть:
Для табличной функции у вас есть что-то интересное, чтобы выбрать строку для обновления, например:
… и в этом (по моему скромному мнению) истинная сила детерминированного обновления только самых верхних выбранных строк, в то же время упрощая синтаксис заявление.
4
2015-04-23 18:18
ОБНОВЛЕНИЕ Dispatch_Post
SET isSync = 1 ГДЕ ChallanNo IN (ВЫБЕРИТЕ ТОП 1000 ChallanNo FROM dbo.Dispatch_Post ORDER BY CreatedDate DESC)
1
2018-08-29 11:46
Вы также можете обновить выбор, используя псевдоним, и присоединиться:
1
2019-05-09 16:55
Квалификатор TOP также можно использовать для ограничения количества строк, неправильно обновляемых вручную.
Рассмотрим следующий синтаксис UPDATE.
Без предложения TOP, если вы выполняете обновление вручную, а выделение текста с помощью мыши выбирает только от «UPDATE» до непосредственно перед предложением «WHERE», то обновление применяется ко ВСЕМ строкам. С предложением TOP только одна строка получит нежелательное обновление.
Ограничение TOP может ограничить ущерб из-за отсутствия или неправильного предложения WHERE или ORDER BY. Это может быть полезно, когда известно, что нужно обновить только одну или несколько строк.
2021-07-09 15:22
этот фрагмент кода может делать свою работу
Если вы хотите показать последние 100 записей, вы можете использовать это, если вам нужно.
2021-01-12 16:23
Next Steps
После обновления до SQL Serverвыполните следующие задачи.
-
Регистрация серверов: в процессе обновления удаляются настройки реестра для предыдущего экземпляра SQL Server. После обновления необходимо заново зарегистрировать серверы.
-
Обновление статистики — чтобы оптимизировать производительность запросов, рекомендуется обновить статистику для всех обновленных баз данных. Вызовите хранимую процедуру sp_updatestats, чтобы обновить статистику в пользовательских таблицах баз данных SQL Server.
-
Настройка новой установки SQL Server — чтобы уменьшить уязвимую контактную зону системы, SQL Server по выбору устанавливает и активирует ключевые службы и функции. Дополнительные сведения о настройке контактной зоны см. в файле Readme для данной версии.
Пример
В следующем примере выполняется обновление копии базы данных предыдущей версии SQL Server. Инструкции Transact-SQL выполняются в окне редактора запросов, подключенном к экземпляру сервера, к которому выполнено присоединение.
Отсоедините базу данных, выполнив следующие инструкции Transact-SQL .
Скопируйте любым способом данные и файлы журнала в новое местоположение.
Важно!
При работе с производственными базами данных рекомендуется помещать базу данных и журналы транзакций на отдельные диски. Эти диски имеют разные требования к операциям ввода-вывода и росту файлов, и лучше разделить их.
При копировании файлов по сети на диск удаленного компьютера укажите имя удаленного места в формате UNC
UNC-имя принимает форму . Как и при записи файлов на жесткий диск локального компьютера, для записи (или считывания) файла на диск удаленного компьютера учетной запись пользователя, которая используется экземпляром SQL Server, должны быть предоставлены соответствующие разрешения.
Присоедините перемещенную базу данных и, если потребуется, ее журнал, выполнив следующую инструкцию Transact-SQL .
В среде SQL Server Management Studioтолько что присоединенная база данных отображается в обозревателе объектов не сразу. Чтобы отобразить базу данных, щелкните в обозревателе объектов пункт Вид , а затем Обновить. Теперь, раскрыв в обозревателе объектов узел Базы данных , можно увидеть в списке присоединенную базу данных.
Пример — обновить один столбец
Давайте рассмотрим пример, показывающий, как использовать SQL оператор UPDATE для обновления одного столбца в таблице.
В этом примере UPDATE у нас есть таблица customers со следующими данными:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
Теперь давайте продемонстрируем, как работает оператор UPDATE, обновив один столбец в таблице customers. Введите следующую команду UPDATE.
PgSQL
UPDATE customers
SET first_name = ‘Joseph’
WHERE customer_id = 8000;
1 |
UPDATEcustomers SETfirst_name=’Joseph’ WHEREcustomer_id=8000; |
Будет обновлена 1 запись. Выберите данные из таблицы customers еще раз:
PgSQL
SELECT *
FROM customers;
1 |
SELECT* FROMcustomers; |
Вот результаты, которые вы должны получить.
Update предупреждение!
Будьте осторожны при обновлении записей. Если вы опустите предложение WHERE, все записи будут обновлены!
Пример
UPDATE Customers
SET ContactName=’Juan’;
Выбор из таблицы «Customers» теперь будет выглядеть следующим образом:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Juan | Obere Str. 57 | Frankfurt | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Juan | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Juan | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Juan | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Juan | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
UPDATE таблица
Следующая инструкция SQL обновляет первого клиента (CustomerID = 1) с новым контактным лицом и новым городом.
Пример
UPDATE Customers
SET ContactName = ‘Alfred Schmidt’, City= ‘Frankfurt’
WHERE CustomerID = 1;
Выбор из таблицы «Customers» теперь будет выглядеть следующим образом:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Frankfurt | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Перед началом
Ограничения
-
Системные базы данных не могут быть присоединены.
-
Присоединение и отсоединение приводят к отмене межбазовых цепочек владения для базы данных с присваиванием параметру cross db ownership chaining значения 0. Сведения о том, как включить цепочки владения, см. в статье Параметр конфигурации сервера «cross db ownership chaining».
-
Присоединение скопированной, а не отсоединенной реплицируемой базы данных:
-
если база данных присоединяется к обновленной версии того же экземпляра сервера, необходимо обновить репликацию после завершения присоединения с помощью хранимой процедуры sp_vupgrade_replication. Дополнительные сведения см. в статье sp_vupgrade_replication (Transact-SQL).
-
если база данных присоединяется к другому экземпляру сервера (независимо от версии), необходимо удалить репликацию после завершения присоединения с помощью хранимой процедуры sp_removedbreplication. Дополнительные сведения см. в статье sp_removedbreplication (Transact-SQL).
-
Рекомендации
Не рекомендуется подключать или восстанавливать базы данных, полученные из неизвестных или ненадежных источников. В этих базах данных может содержаться вредоносный код, вызывающий выполнение непредусмотренных инструкций Transact-SQL или появление ошибок из-за изменения схемы или физической структуры базы данных. Перед тем как использовать базу данных, полученную из неизвестного или ненадежного источника, выполните на тестовом сервере инструкцию DBCC CHECKDB для этой базы данных, а также изучите исходный код в базе данных, например хранимые процедуры и другой пользовательский код.