Запрос sql на изменение данных в таблице: SQL запрос на изменение данных в таблице БД
Внесение изменений в базу данных. Язык запросов SQL
Язык запросов SQL. DML.
Далее рассмотрены SQL-запросы, позволяющие вносить изменения в записи базы данных — вставка, редактирование и удаление строк.
Запрос SQL на вставку
Вставка в таблицу базы данных осуществляется с помощью запросов такого типа:
INSERT INTO ТАбЛИЦА (ПОЛЕ_1,ПОЛЕ_2,…,ПОЛЕ_N)
VALUES (ЗНАЧЕНИЕ_1, ЗНАЧЕНИЕ_2,…, ЗНАЧЕНИЕ_N)
В скобках после имени таблицы перечисляются поля, в которые нужно вставить данные, а в скобках после предложения VALUES – значения, которые нужно вставить в соответствующие поля таблицы, перечисленные выше. Вставка осуществляется таким образом, что первое из перечисленных значений помещается в поле, перечисленное в списке полей первым, второе – во второе и т.д. Из всего сказанного можно сделать вывод о том, что значения, перечисленные в предложении VALUES должны быть совместимы с полями таблицы, в которую осуществляется вставка.
Например, добавим в таблицу покупателей новую запись. Для этого напишем запрос следующего вида:
INSERT INTO Buyers (BNum, BName, BTown) VALUES (6, "Маркет", 4)
В результате мы добавили покупателя с номером 6, наименованием «Маркет», с номером города 4.
Нередко вместо предложения VALUES используют запрос типа SELECT, результатом которого является набор значений полей, соответствующих набору перечисленных полей таблицы, в которую осуществляется вставка. Предположим, что в нашей базе данных есть еще одна таблица otherBuyers, точно такая же по структуре, как и таблица Buyers. Добавим в таблицу Buyers все записи из таблицы otherBuyers. Для этого напишем запрос:
INSERT INTO Buyers (BNum, BName, BTown) SELECT * FROM otherBuyers
Запрос SQL на изменение данных
Структура запроса внесения изменений в записи таблицы выглядит следующим образом:
UPDATE ТАБЛИЦА
SET
ПОЛЕ_1 = ЗНЕНИЕ_1,
ПОЛЕ_2 = ЗНЕНИЕ_2,
…,
ПОЛЕ_N = ЗНЕНИЕ_N
WHERE УСЛОВИЕ
Все изменения, описанные в запросе, коснутся только тех записей, которые удовлетворяют условию, описанному в предложении WHERE. Если нужно внести изменения во всю таблицу, то предложение WHERE не описывают.
Например, увеличим цены товаров в два раза, относящихся к первой группе. Текст запроса будет таким:
UPDATE Goods SET GPrice=GPrice*2 WHERE GTypeNum=1
В предложении WHERE можно использовать подзапросы.
Подзапросы так же можно использовать и в предложении SET после имени поля и знака равенства. Результатом подзапроса должно быть только одно значение, совместимого по типу с полем указанным перед знаком равенства. Например, пересчитаем сумму в таблице покупок, для товара с номером 1.
UPDATE Sells SET SSum= SQnty*(Select Gprice FROM Goods WHERE GNum=1) WHERE GNum=1
Опасность такого запроса заключается в том, что если результатом подзапроса буден несколько значений, то в запрос выполнен не будет. Возникнет ошибка. Поэтому при написании запроса такого типа надо быть уверенным, что результат подзапроса – это одно поле. В силу этих причин в таких подзапросах обычно используются агрегатные функции или инструкция DISTINCT.
Запрос SQL на удаление строк
Для удаления используются запросы типа Delete:
DELETE FROM ТАБЛИЦА
WHERE УСЛОВИЕ
Предложение WHERE также является дополнительным разделом. Однако без него такие запросы используются редко, так как отсутствие условия означает в удаление всех записей таблицы!
Приведем пример использования запроса типа Delete. Удалим всех покупателей из таблицы покупателей, которые относятся к городу Москва.
DELETE FROM Buyers WHERE BTown IN (SELECT TNum FROM Touns WHERE TName = "Москва")
Руководство по SQL. Изменение данных. – PROSELYTE
Для изменения уже существующих данных мы используем SQL запрос UPDATE.
Для того, чтобы указать, какие именно данные необходимо изменить, мы должны использовать условный оператор WHERE.
Данный запрос имеет следующий вид:
UPDATE имя_таблицы
SET колонка1 = значение1, колонка2 = значение2, колонкаN = значениеN
WHERE [условие1];
Мы также можем использовать операторы AND/OR для уточнения условий.
Пример:
Предположим, что у нас есть таблица developers, которая содержит следующие данные:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2000 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 2 | 2100 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
Допустим, что нам необходимо изменить зарплату разработчика с именем Eugene Suleimanov. Для этого мы должны использовать следующую команду:
mysql> UPDATE developers
SET SALARY = 2500
WHERE NAME LIKE 'Eugene Suleimanov';
В результате наша запись будет изменена и наша таблица будет содержать уже такие данные:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 2 | 2100 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
Если мы хотим изменить несколько полей, например, опыт и зарплату, то наш запрос будет иметь следующий вид:
mysql> UPDATE developers
SET EXPERIENCE = 3, SALARY = 2500
WHERE NAME LIKE 'Andrei Komarov';
В результате выполнения данного запроса, наша таблица developers будет иметь следующий вид:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
На этом мы заканчиваем изучение способов изменения существующих данных.
В следующей статье мы рассмотрим процесс удаления записей.
Вставка, изменение и удаление записей таблицы с помощью Access SQL
-
- Чтение занимает 2 мин
В этой статье
Вставка записей в таблицуInsert records into a table
По существу, существует два метода добавления записей в таблицу.There are essentially two methods for adding records to a table. Первый — добавление по одной записи за раз, второй — одновременное добавление нескольких записей.The first is to add one record at a time; the second is to add many records at a time. В обоих случаях для выполнения задачи необходимо использовать инструкцию SQL INSERT INTO.In both cases, you use the SQL statement INSERT INTO to accomplish the task. Инструкции INSERT INTO обычно называют запросами на добавление.INSERT INTO statements are commonly referred to as append queries.
Чтобы добавить одну запись в таблицу, с помощью списка полей определите, в какие поля следует поместить данные, а затем разместите данные в списке значений.To add one record to a table, you must use the field list to define which fields to put the data in, and then you must supply the data itself in a value list. Для определения списка значений используйте выражение VALUES.To define the value list, use the VALUES clause. Например, указанная ниже инструкция вставляет значения 1, Kelly и Jill в поля CustomerID, Last Name и First Name соответственно.For example, the following statement will insert the values «1», «Kelly», and «Jill» into the CustomerID, Last Name, and First Name fields, respectively.
INSERT INTO tblCustomers (CustomerID, [Last Name], [First Name])
VALUES (1, 'Kelly', 'Jill')
Вы можете опустить список полей, но только в том случае, если вы передаете все значения, которые должна содержать запись.You can omit the field list, but only if you supply all the values that record can contain.
INSERT INTO tblCustomers
VALUES (1, Kelly, 'Jill', '555-1040', '[email protected]')
Чтобы добавить одновременно несколько записей в таблицу, используйте инструкцию INSERT INTO совместно с инструкцией SELECT.To add many records to a table at one time, use the INSERT INTO statement along with a SELECT statement. Если вы вставляете записи из другой таблицы, тип каждого вставляемого значения должен быть совместим с типом поля, принимающего данные.When you are inserting records from another table, each value being inserted must be compatible with the type of field that will be receiving the data.
Указанная ниже инструкция INSERT INTO вставляет все значения полей CustomerID, Last Name и First Name таблицы tblOldCustomers в соответствующие поля таблицы tblCustomers.The following INSERT INTO statement inserts all the values in the CustomerID, Last Name, and First Name fields from the tblOldCustomers table into the corresponding fields in the tblCustomers table.
INSERT INTO tblCustomers (CustomerID, [Last Name], [First Name])
SELECT CustomerID, [Last Name], [First Name]
FROM tblOldCustomers
Если таблицы определены совершенно одинаково, можно не использовать списки полей.If the tables are defined exactly alike, you can leave out the field lists.
INSERT INTO tblCustomers
SELECT * FROM tblOldCustomers
Изменение записей в таблицеUpdate records in a table
Чтобы изменить текущие данные в таблице, используйте инструкцию UPDATE, которую обычно называют запросом на обновление.To modify the data that is currently in a table, you use the UPDATE statement, which is commonly referred to as an update query. Инструкция UPDATE может изменить одну или несколько записей и обычно имеет указанный ниже вид.The UPDATE statement can modify one or more records and generally takes this form.
UPDATE table name
SET field name = some value
Чтобы изменить все записи в таблице, укажите имя таблицы и с помощью выражения SET укажите поле или поля, которые необходимо изменить.To update all the records in a table, specify the table name, and then use the SET clause to specify the field or fields to be changed.
UPDATE tblCustomers
SET Phone = 'None'
В большинстве случаев вам потребуется уточнить инструкцию UPDATE с помощью выражения WHERE, чтобы ограничить количество изменяемых записей.In most cases, you will want to qualify the UPDATE statement with a WHERE clause to limit the number of records changed.
UPDATE tblCustomers
SET Email = 'None'
WHERE [Last Name] = 'Smith'
Удаление записей из таблицыDelete records from a table
Чтобы удалить текущие данные в таблице, используйте инструкцию DELETE, которую обычно называют запросом на удаление.To delete the data that is currently in a table, you use the DELETE statement, which is commonly referred to as a delete query. Эту операцию также называют усечением таблицы.This is also known as truncating a table. Инструкция DELETE может удалить одну или несколько записей из таблицы и обычно имеет следующий вид:The DELETE statement can remove one or more records from a table and generally takes this form:
DELETE FROM table list
Инструкция DELETE не удаляет структуру таблицы, она удаляет только данные, хранящиеся в структуре таблицы.The DELETE statement does not remove the table structure—only the data that is currently being held by the table structure. Чтобы удалить все записи из таблицы, используйте инструкцию DELETE и укажите одну или несколько таблиц, из которых вы хотите удалить все записи.To remove all the records from a table, use the DELETE statement and specify which table or tables from which you want to delete all the records.
DELETE FROM tblInvoices
В большинстве случаев вам потребуется уточнить инструкцию DELETE с помощью выражения WHERE, чтобы ограничить количество удаляемых записей.In most cases, you will want to qualify the DELETE statement with a WHERE clause to limit the number of records to be removed.
DELETE FROM tblInvoices
WHERE InvoiceID = 3
Если вы хотите удалить данные только из определенных полей таблицы, используйте инструкцию UPDATE и присвойте этим полям значение NULL, но только в том случае, если эти поля допускают значение NULL.If you want to remove data only from certain fields in a table, use the UPDATE statement and set those fields equal to NULL, but only if they are nullable fields.
UPDATE tblCustomers
SET Email = Null
Поддержка и обратная связьSupport and feedback
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
SQL ALTER TABLE — изменение таблицы базы данных
Команда языка SQL ALTER TABLE предназначена для изменения структуры столбца таблицы базы данных, если
таблица уже существует.
Запрос с командой ALTER TABLE на добавление нового столбца в таблицу имеет следующий синтаксис:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
ADD ИМЯ_НОВОГО_СТОЛБЦА ТИП_ДАННЫХ
Пример 1. Есть база данных фирмы — Company. В ней есть таблица
Employee (Сотрудник). Требуется добавить в эту таблицу новый столбец — SEX (Пол). Соответствующий запрос
выглядит следующим образом:
ALTER TABLE EMPLOYEE
ADD SEX CHAR(1)
Таким образом в таблице появился новый столбец, значения которого могут принимать
символьный тип и состоять из одного символа.
Пусть теперь требуется установить значение записей в таблице по умолчанию. Запрос с командой ALTER TABLE
для этой цели содержит ещё одну команду — ALTER COLUMN — и имеет следующий синтаксис:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
ALTER COLUMN ИМЯ_СТОЛБЦА
SET DEFAULT ‘ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ’
Пример 2. Пусть в фирме, база данных которой имеет название Company,
трудятся в основном женщины. Администратор базы данных решил сократить процесс заполнения данными столбца
SEX (Пол) и установить его значение по умолчанию — ‘F’ (что означает женский пол). Соответствующий запрос
выглядит следующим образом:
ALTER TABLE EMPLOYEE
ALTER COLUMN SEX
SET DEFAULT ‘F’
Теперь только если новый сотрудник — мужчина, потребуется вписывать в столбец SEX
значение ‘M’, а в большинстве случаев значение установится по умолчанию — ‘F’.
При помощи запроса с командой ALTER TABLE можно и удалить столбец из таблицы. Синтаксис команды будет
следующим:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
DROP COLUMN ИМЯ_СТОЛБЦА
Пример 3. Пусть в той же базе данных Company из
таблицы Employee требуется удалить столбец SEX (Пол). Соответствующий запрос
выглядит следующим образом:
ALTER TABLE EMPLOYEE
DROP COLUMN SEX
Таким образом в таблице появился новый столбец, значения которого могут принимать
символьный тип и состоять из одного символа.
О ключах в таблицах базы данных — на уроке Реляционная модель данных.
Если при создании таблицы базы данных не был определён первичный ключ (PRIMARY KEY), то это может быть
сделано при помощи команды ALTER TABLE. Синтаксис команды в случае простого первичного ключа следующий:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
ADD PRIMARY KEY (ИМЯ_ИДЕНТИФИКАТОРА)
Синтаксис команды в случае составного первичного ключа:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
ADD PRIMARY KEY (ИМЯ_ИДЕНТИФИКАТОРА_1, ИМЯ_ИДЕНТИФИКАТОРА_2)
Пример 4. Работаем всё с той же базой данных Company,
со столбцом EMPLOYEE. Мы можем добавить простой первичный ключ этого столбца в виде идентификатора
сотрудника и сделать это так:
ALTER TABLE EMPLOYEE
ADD PRIMARY KEY (EMP_ID)
Если решено использовать составной ключ, состоящий из идентификатора сотрудника и
идентификатора отдела, в котором сотрудник работает, то используем следующий запрос:
ALTER TABLE EMPLOYEE
ADD PRIMARY KEY (EMP_ID, DEPT_ID)
О том, что такое ограничения целостности, говорилось на уроке Реляционная модель данных.
Если коротко — при удалении какой-либо строки из одной таблицы (1), в другой таблице (2), строка в которой
ссылается на строку таблицы (1), не должно быть ссылок, которые не содержатся в таблице (1), то есть
ссылок, ведущих в никуда.
Команда с выражением ALTER TABLE может понадобиться для установки значения NULL для такой ссылки. Её
синтаксис следующий:
ALTER TABLE ИМЯ_ССЫЛАЮЩЕЙСЯ_ТАБЛИЦЫ
ADD CONSTRAINT ИМЯ_ИДЕНТИФИКАТОРА
FOREIGN KEY (ИМЯ_ИДЕНТИФИКАТОРА)
REFERENCES ИМЯ_ТАБЛИЦЫ_НА_КОТОРУЮ_ССЫЛАЮТСЯ
ON DELETE SET NULL
Пример 5. Пусть в той же базе данных Company
требуется установить ссылочное ограничение: при удалении какого-либо отдела из таблицы Dept
в таблице Employee, содержатся ссылки на эти отделы, значение ссылки (внешнего ключа) должно быть
уставлено в NULL (полностью неопределенное). Соответствующий запрос
выглядит следующим образом:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT DEPT_ID
FOREIGN KEY (DEPT_ID)
REFERENCES DEPT
ON DELETE SET NULL
Таким образом, если в таблице Employee есть сотрудник, работающий в отделе, который
вдруг был ликвидирован и запись о нём удалена из таблицы Dept, то в записи об этом сотруднике значение
столбца DEPT_ID примет значение NULL.
Запросом с командой ALTER TABLE можно также установить запрет на удаление ссылающихся записей из таблицы (1), если
существует хотя бы одна запись в таблице (2), на которую ссылается запись в таблице (1). Синтаксис такого
запроса следующий:
ALTER TABLE ИМЯ_ССЫЛАЮЩЕЙСЯ_ТАБЛИЦЫ
ADD CONSTRAINT ИМЯ_ИДЕНТИФИКАТОРА
FOREIGN KEY (ИМЯ_ИДЕНТИФИКАТОРА)
REFERENCES ИМЯ_ТАБЛИЦЫ_НА_КОТОРУЮ_ССЫЛАЮТСЯ
ON DELETE RESTRICT
Пример 6. Далее работаем с базой данных сети аптек, которую мы создали на уроке Создание базы
данных SQL и таблиц базы данных.
Следующая команда с выражением alter table устанавливает запрет на удаление группы препаратов из таблицы Group, если существует хотя бы один препарат этой группы, что определяется записью в таблице Preparation:
alter table Preparation add constraint GR_ID foreign key(GR_ID) references Group on delete restrict
Устанавливаем запрет на удаление аптеки из таблицы Pharmacy, если существует хотя бы один сотрудник этой аптеки, что определяется записью в таблице Employee:
alter table Employee add constraint PH_ID foreign key(PH_ID) references
Pharmacy on delete restrict
Запросом с командой ALTER TABLE можно также определить, что если удалить запись в таблице (2), на которую
ссылается запись в таблице (1), то должны быть удалены все соответствующие записи в таблице (1) (каскадное
удаление).
Синтаксис такого запроса следующий:
ALTER TABLE ИМЯ_ССЫЛАЮЩЕЙСЯ_ТАБЛИЦЫ
ADD CONSTRAINT ИМЯ_ИДЕНТИФИКАТОРА
FOREIGN KEY (ИМЯ_ИДЕНТИФИКАТОРА)
REFERENCES ИМЯ_ТАБЛИЦЫ_НА_КОТОРУЮ_ССЫЛАЮТСЯ
ON DELETE CASCADE
Пример 7. Продолжаем работать с базой данных сети аптек.
Вновь изменяем таблицу AVAILABILITY и определяем, что если удалить препарат из таблицы PREPARATION, то должны удалиться все записи этого препарата в таблице AVAILABILITY.
alter table AVAILABILITY add constraint PR_ID foreign key(PR_ID)
references PREPARATION on delete cascade
Теперь определим, что если удалить аптеку из таблицы PHARMACY, то должны удалиться все записи этой аптеки в таблице AVAILABILITY:
alter table AVAILABILITY add constraint PH_ID foreign key(PH_ID)
references PHARMACY on delete cascade
Следующая команда модифицирует таблицу DEFICIT и определяет, что если удалить препарат из таблицы PREPARATION, то должны удалиться все записи этого препарата в таблице DEFICIT:
alter table DEFICIT add constraint PR_ID foreign key(PR_ID) references
PREPARATION on delete cascade
iv>
Вновь модифицируем таблицу DEFICIT и определяем, что если удалить аптеку из таблицы PHARMACY, то должны удалиться все записи этой аптеки в таблице DEFICIT:
alter table DEFICIT add constraint PH_ID foreign key(PH_ID) references
PHARMACY on delete cascade
Запросом с командой ALTER TABLE можно установить проверочное ограничение.
Синтаксис такого запроса следующий:
ALTER TABLE ИМЯ_ТАБЛИЦЫ
ADD CONSTRAINT CHECK_DATA
CHECK(ПРОВЕРЯЕМОЕ_УСЛОВИЕ)
Пример 8. Продолжаем работать с базой данных сети аптек.
Нужно модифицировать таблицу AVAILABILITY и определить, что в одной и той же записи значение атрибута DateStart таблицы не должно быть меньше значения DateEnd.
ALTER TABLE AVAILABILITY ADD CONSTRAINT CHECK_DATA CHECK(DateStart
Изменяем таблицу DEFICIT и определяем, что в одной и той же записи значение атрибута DateStart таблицы не должено быть меньше значения DateEnd:
ALTER TABLE DEFICIT ADD CONSTRAINT CHECK_DATA CHECK(DateStart
Поделиться с друзьями
Реляционные базы данных и язык SQL
SQL-запросы для работы с таблицами
Вы здесь:
Главная — MySQL — SQL — SQL-запросы для работы с таблицами
В этот раз мы с Вами разберём SQL-запросы для работы с таблицами базы данных. Безусловно, данная тема является не такой уж и важной, так как в реальности автоматически создавать новые таблицы приходится крайне редко, но всё-таки данная статья будет полезна хотя бы для общих знаний, поэтому ознакомьтесь с ней.
Начнём с простого запроса на создание новой таблицы:
CREATE TABLE users (id INT AUTO_INCREMENT, login TEXT, pass VARCHAR, PRIMARY KEY (id))
При создании таблицы вначале идёт команда «CREATE TABLE«, затем имя таблицы. В скобках идут различные данные, описавающие названия и типы полей. Мы создали поле «id» типа int, а также сделали его AUTO_INCREMENT. Создали поля «login» и «pass» типа varchar. Также поле ID сделали первичным ключом. Как видите, синтаксис не сложный, однако, у него существует много вариаций, но все они интуитивно создаются. В крайнем случае, не забывайте, что всегда SQL-запрос можно посмотреть в PHPMyAdmin.
Теперь давайте разберём SQL-запрос для переименования таблицы базы данных:
ALTER TABLE users RENAME newname
После команды «ALTER TABLE» идёт имя таблицы, которую мы хотим переименовать, затем «RENAME» и то имя, на которое мы хотим изменить название таблицы.
Теперь SQL-запрос на удаление базы данных:
DROP TABLE newname
При удалении таблицы надо отправить название команды «DROP TABLE«, а затем имя таблицы, которую требуется удалить.
Теперь переходим к работе с полями (столбцами) таблиц. И начём с добавления новых полей в таблицу:
ALTER TABLE users ADD firstname TEXT
В данном коде мы вставляем в таблицу «users» новое поле с именем «firstname» и типом text.
Код для изменения параметров поля таблицы:
ALTER TABLE users CHANGE pass password VARCHAR, CHANGE firstname firstname VARCHAR
В данном SQL-запросе мы в таблице «users» изменили два поля: имя поля «pass» мы сменили на «password«, а у поля «firstname» мы имя оставили прежним, а тип сменили на varchar. Если Вам требуется изменить только одно поле, то тогда достаточно одной команды CHANGE, иначе через запятую перечисляйте все поля, которые требуется изменить.
И, как Вы, наверное, догадались, SQL-запрос на удаление поля из таблицы:
ALTER TABLE users DROP firstname
Синтаксис очень прозрачный, но всё-таки поясню: после команды «ALTER TABLE» идёт имя таблицы, поле в которой мы хотим удалить. Затем идёт команда «DROP«, сразу за которой имя удаляемого поля.
Это всё, что требуется знать для работы с таблицами базы данных через SQL-запросы.
Полный курс по PHP и MySQL: http://srs.myrusakov.ru/php
-
Создано 16.01.2011 17:43:03 -
Михаил Русаков
Предыдущая статья Следующая статья
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
<a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>Она выглядит вот так:
-
Текстовая ссылка:
<a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
[URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]
SQL Изменить таблицу
SQL ALTER TABLE
Инструкция ALTER TABLE используется для добавления, удаления или изменения столбцов в существующей таблице.
Инструкция ALTER TABLE также используется для добавления и удаления различных ограничений на существующую таблицу.
ALTER TABLE — ADD column
Чтобы добавить столбец в таблицу, используйте следующее Синтаксис:
ALTER TABLE table_name
ADD column_name datatype;
Следующий SQL — добавляет колонку «Email» для таблицы «Customers»:
ALTER TABLE — DROP COLUMN
Чтобы удалить столбец в таблице, используйте следующую команду синтаксис
(обратите внимание, что некоторые системы баз данных не позволяют удалить столбец):
ALTER TABLE table_name
DROP COLUMN column_name;
Следующий SQL удаляет столбец «Email» из таблицы «Customers»:
ALTER TABLE — ALTER/MODIFY COLUMN
Чтобы изменить тип данных столбца в таблице, используйте следующие синтаксис:
SQL Сервер / MS Доступ:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
My SQL / Оракул (предыдущая версия 10G):
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Оракул 10G и более поздние версии:
ALTER TABLE table_name
MODIFY column_name datatype;
SQL Пример ALTER TABLE
Посмотрите на таблицу «Persons»:
ID | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
Теперь мы хотим добавить столбец с именем «DateOfBirth» в таблицу «Persons».
Мы используем следующую инструкцию SQL:
ALTER TABLE Persons
ADD DateOfBirth date;
Обратите внимание, что новый столбец «DateOfBirth» имеет тип date и будет содержать дату.
Тип данных указывает, какой тип данных может содержать столбец.
Для получения полного описания всех типов данных, доступных в MS Access, MySQL и SQL Server,
перейдите к нашему полному Справочнику типов данных.
Таблица «Persons» теперь будет выглядеть так:
ID | LastName | FirstName | Address | City | DateOfBirth |
---|---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes | |
2 | Svendson | Tove | Borgvn 23 | Sandnes | |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
Пример изменения типа данных
Теперь мы хотим изменить тип данных столбца с именем «DateOfBirth» в таблице «Persons».
Мы используем следующую инструкцию SQL:
ALTER TABLE Persons
ALTER COLUMN DateOfBirth year;
Обратите внимание, что столбец «DateOfBirth» теперь имеет тип year и будет содержать year в двух или четырехзначном формате.
Пример DROP COLUMN
В первую очередь, мы хотим удалить столбец с именем «DateOfBirth» в таблице «Persons».
Мы используем следующую инструкцию SQL:
ALTER TABLE Persons
DROP COLUMN DateOfBirth;
Таблица «Persons» теперь будет выглядеть так:
ID | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
Руководство по SQL. Изменение таблицы. – PROSELYTE
Для добавления, удаления либо изменения колонок существующей таблицы, в языке SQL используется команда ALTER TABLE. Данная команда также используется для добавления, либо удаления различных констрейнтов в/из существующих таблиц.
Запрос с использованием команды ALTER TABLE для добавления новой колонки имеет следующий вид:
ALTER TABLE имя_таблицы ADD имя_колонки тип_данных;
Для удаления колонки:
ALTER TABLE имя_таблицы DROP имя_колонки;
Для изменения типа данных:
ALTER TABLE имя_таблицы MODIFY COLUMN имя_колонки тип_данных;
Для добавления констрейнта (например, NOT NULL):
ALTER TABLE имя_таблицы MODIFY имя_колонки тип_данных NOT NULL;
Для удаления констрейнта (например, NOT NULL):
ALTER TABLE имя_таблицы DROP CONSTRAINT someConstraint;
Пример:
Предположим, что у нас есть таблица developers, которая содержит следующие записи:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
| 6 | Kolya Nikolaev | Javascript | 5 | 3400 |
| 7 | Ivan Ivanov | C# | 1 | 900 |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
Допустим, что мы хотим добавить новую колонку AGE (возраст).
Для этого нам необходимо использовать следующую команду:
mysql> ALTER TABLE developers ADD AGE INT;
Теперь наша таблица содержит данные такого вида:
+----+-------------------+------------+------------+--------+------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY | AGE |
+----+-------------------+------------+------------+--------+------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 | NULL |
| 2 | Peter Romanenko | Java | 3 | 3500 | NULL |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 | NULL |
| 4 | Konstantin Geiko | C# | 2 | 2000 | NULL |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 | NULL |
| 6 | Kolya Nikolaev | Javascript | 5 | 3400 | NULL |
| 7 | Ivan Ivanov | C# | 1 | 900 | NULL |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 | NULL |
+----+-------------------+------------+------------+--------+------+
Теперь попробуем удалить колонку AGE.
Для этого выполним следующий запрос:
mysql> ALTER TABLE developers DROP AGE;
В результате выполнения данного запроса, наша таблица будет иметь записи следующего вида:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
| 6 | Kolya Nikolaev | Javascript | 5 | 3400 |
| 7 | Ivan Ivanov | C# | 1 | 900 |
| 8 | Ludmila Geiko | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
На этом мы заканчиваем изучения способа изменения структуры таблицы.
В следующей статье мы рассмотрим способ удаления всех данных из таблицы.
Оператор
SQL UPDATE — обновление данных в таблице
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL UPDATE для изменения существующих данных в таблице.
Синтаксис SQL UPDATE
Оператор UPDATE
изменяет существующие данные в одной или нескольких строках таблицы. Следующее иллюстрирует синтаксис оператора UPDATE
:
Таблица UPDATE SET column1 = new_value1, column2 = new_value2, … ГДЕ состояние; |
Чтобы обновить данные в таблице, вам необходимо:
- Сначала укажите имя таблицы, данные которой вы хотите изменить, в предложении
UPDATE
. - Во-вторых, назначьте новое значение столбцу, который вы хотите обновить. Если вы хотите обновить данные в нескольких столбцах, каждая пара столбец = значение разделяется запятой (,).
- В-третьих, укажите, какие строки вы хотите обновить, в предложении WHERE.Предложение
WHERE
является необязательным. Если вы опустите предложениеWHERE
, все строки в таблице будут обновлены.
Ядро базы данных выдает сообщение с указанием количества затронутых строк после выполнения оператора.
Примеры операторов SQL UPDATE
Давайте рассмотрим некоторые примеры использования оператора UPDATE
с таблицей сотрудников
:
SQL UPDATE пример одного столбца
Предположим, Джанет, у которой есть идентификатор сотрудника 3, выходит замуж, чтобы вам нужно изменить ее фамилию в таблице сотрудников
.
Запись Джанет в сотрудниках до обновления выглядит следующим образом:
SELECT employeeid, lastname, firstname FROM northwind_bk.employees WHERE employeeid = 3; |
Следующее утверждение изменяет фамилию Джанет с Levering на Hill:
UPDATE сотрудники SET lastname = ‘Hill’ WHERE employeeID = 3; |
Выполните приведенный выше оператор SELECT еще раз, чтобы проверить изменение:
SQL UPDATE несколько столбцов
Например, Джанет переехала в новый дом, поэтому ее адрес изменился.Теперь вам нужно изменить его в таблице сотрудников
, используя следующий оператор:
UPDATE сотрудники SET адрес = ‘1300 Carter St’, city = ‘San Jose’, почтовый индекс = 95125, регион = ‘CA’ ГДЕ employeeID = 3; |
SQL UPDATE несколько строк
Следующий оператор UPDATE
увеличивает зарплату на 2% для сотрудников, чья зарплата меньше 2000 долларов:
UPDATE сотрудников SET зарплата = зарплата * 1.02 ГДЕ зарплата <2000; |
Повышение по службе получили сотрудники с зарплатой менее 2К.
ОБНОВЛЕНИЕ SQL из SELECT
Следующий запрос выбирает продавца, который отвечал за более чем 100 заказов:
SELECT employeeid, COUNT (orderid) FROM orders WHERE shippeddate НЕ ПУСТЬ GROUP BY ID сотрудника HAVING COUNT (orderid)> 100; |
Следующий запрос увеличивает зарплату лучших продавцов на 5%.Идентификаторы лучших продавцов предоставляются с помощью подзапроса.
ОБНОВЛЕНИЕ сотрудников НАБОР зарплата = зарплата * 1.05 ГДЕ employeeid IN (SELECT employeeid FROM (SELECT employeeid) (SELECT employeeid) заказов WHERE shippeddate IS NOT NULL GROUP BY employeeid HAVING COUNT (orderid)> 100) bestsalesperson) |
В этом руководстве мы показали вам, как использовать инструкцию SQL UPDATE для изменения данные в одной или нескольких строках таблицы.
- Было ли это руководство полезным?
- Да Нет
.
sql server — SQL-запрос для отображения истории изменений данных
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
SQL ALTER TABLE Заявление
SQL ALTER TABLE Заявление
Оператор ALTER TABLE используется для добавления, удаления или изменения столбцов в существующей таблице.
Оператор ALTER TABLE также используется для добавления и удаления различных ограничений на
существующая таблица.
ИЗМЕНИТЬ ТАБЛИЦУ — ДОБАВИТЬ столбец
Чтобы добавить столбец в таблицу, используйте следующий синтаксис:
ALTER TABLE имя_таблицы
ДОБАВИТЬ имя_столбца тип данных ;
Следующий SQL добавляет столбец «Электронная почта» в таблицу «Клиенты»:
ИЗМЕНЕНИЕ ТАБЛИЦЫ — ВЫПУСКНАЯ КОЛОНКА
Чтобы удалить столбец в таблице, используйте следующий синтаксис (обратите внимание, что некоторые
системы баз данных не позволяют удалить столбец):
ALTER TABLE имя_таблицы
DROP COLUMN имя_столбца ;
Следующий SQL удаляет столбец «Электронная почта» из таблицы «Клиенты»:
ИЗМЕНИТЬ ТАБЛИЦУ — ИЗМЕНИТЬ / ИЗМЕНИТЬ КОЛОНКУ
Чтобы изменить тип данных столбца в таблице, используйте следующий синтаксис:
SQL Server / MS Доступ:
ALTER TABLE имя_таблицы
ALTER COLUMN имя_столбца тип данных ;
Мой SQL / Oracle (предыдущая версия 10G):
ALTER TABLE имя_таблицы
ИЗМЕНИТЬ КОЛОНКУ имя_столбца тип данных ;
Oracle 10G и выше:
ALTER TABLE имя_таблицы
ИЗМЕНИТЬ имя_столбца тип данных ;
SQL ALTER TABLE, пример
Посмотрите на таблицу «Персоны»:
ID | Фамилия | Имя | Адрес | Город |
---|---|---|---|---|
1 | Хансен | Ола | Тимотеевн 10 | Санднес |
2 | Свендсон | Тове | Borgvn 23 | Санднес |
3 | Петтерсен | Кари | Storgt 20 | Ставангер |
Теперь мы хотим добавить столбец с именем «DateOfBirth» в таблицу «Persons».
Мы используем следующий оператор SQL:
ALTER TABLE Лица
ДОБАВИТЬ DateOfBirth date;
Обратите внимание, что новый столбец «DateOfBirth» имеет тип date и будет содержать
Дата. Тип данных указывает, какой тип данных может содержать столбец. Для полного
ссылка на все типы данных, доступные в MS Access, MySQL и SQL Server,
перейдите к нашему полному справочнику по типам данных.
Таблица «Персоны» теперь будет выглядеть так:
ID | Фамилия | Имя | Адрес | Город | Дата рождения |
---|---|---|---|---|---|
1 | Хансен | Ола | Тимотеевн 10 | Санднес | |
2 | Свендсон | Тове | Borgvn 23 | Санднес | |
3 | Петтерсен | Кари | Storgt 20 | Ставангер |
Пример изменения типа данных
Теперь мы хотим изменить тип данных столбца с именем «DateOfBirth» в таблице «Persons».
Мы используем следующий оператор SQL:
ALTER TABLE Лица
ИЗМЕНИТЬ КОЛОНКУ Дата года рождения;
Обратите внимание, что столбец «DateOfBirth» теперь имеет тип года и будет содержать год в двух- или четырехзначном формате.
КАПЕЛЬНАЯ КОЛОНКА Пример
Затем мы хотим удалить столбец с именем «DateOfBirth» в таблице «Persons».
Мы используем следующий оператор SQL:
ALTER TABLE Лица
DROP COLUMN DateOfBirth;
Таблица «Персоны» теперь будет выглядеть так:
ID | Фамилия | Имя | Адрес | Город |
---|---|---|---|---|
1 | Хансен | Ола | Тимотеевн 10 | Санднес |
2 | Свендсон | Тове | Borgvn 23 | Санднес |
3 | Петтерсен | Кари | Storgt 20 | Ставангер |
.
Как отслеживать историю изменений данных с помощью темпоральных таблиц с системным управлением версиями SQL Server 2016
SQL Server 2016 представляет новый тип таблицы, предназначенный для хранения полной истории изменений данных, где допустимость строки управляется системой. Этот новый тип таблицы называется временной таблицей с системным управлением версиями . В более ранних версиях SQL Server пользовательские таблицы позволяли хранить только самую последнюю копию строки, не имея возможности запрашивать значение перед операциями UPDATE или DELETE.Используя временную таблицу, вы сможете запрашивать последнее состояние строки, как обычно, в дополнение к возможности запрашивать полную историю этой строки, которая полностью управляется механизмом SQL Server Engine, поскольку вы не можете определить срок действия строк явно.
Каждая темпоральная таблица с системным управлением версиями должна содержать два столбца периода времени и даты, которые явно определены в таблице; столбец Period Start , который будет использоваться системой для хранения времени начала строки, и столбец Period End , в котором система сохранит время окончания строки.
Основная темпоральная таблица будет содержать только текущую версию строк таблицы, но она будет автоматически связана с другой таблицей с такой же точной схемой, в которой предыдущие версии измененных строк будут сохранены автоматически, эта таблица называется таблицей. История стол. Когда вы создаете временную таблицу, она будет создана автоматически. Если вы не укажете имя таблицы истории в качестве параметра в предложении SYSTEM_VERSIONING , ей будет присвоено имя с шаблоном именования MSSQL_TemporalHistoryFor_
Когда новая строка вставлена , система назначит столбцу времени начала периода текущее время начала транзакции на основе системных часов и назначит столбец времени окончания периода с максимальным значением datetime2, равным 9999-12- 31, и ряд откроется. Если существующая строка — , обновленная , система скопирует предыдущую версию строки в таблице истории и заполнит столбец Время окончания периода текущим временем начала транзакции на основе системных часов, и строка будет закрыта.Значение столбца времени окончания периода основной темпоральной таблицы будет 9999-12-31 без каких-либо изменений.
При удалении существующей строки эта строка будет сохранена в таблице истории со значением столбца времени окончания периода, равным текущему времени начала транзакции на основе системных часов, и строка будет закрыта после удаления ее из основного темпоральная таблица.
Управление версиями системы может быть включено, когда таблица создается с помощью оператора CREATE TABLE или после создания таблицы с помощью оператора ALTER DATABASE.Чтобы включить управление версиями системы в таблице, у нее должен быть первичный ключ с двумя столбцами периода datetime2, не допускающими значения NULL, определенными как GENERATED ALWAYS AS ROW START или END, передано как параметры в PERIOD FOR SYSTEM_TIME внутри определения таблицы.
Приведенный ниже оператор CREATE TABLE используется для создания темпоральной таблицы Temporal_Table_Demo с первичным ключом DempID, столбцами с двумя периодами; TimeStart СОЗДАЕТСЯ ВСЕГДА КАК НАЧАЛО СТРОКИ и TimeEnd СОЗДАЕТСЯ ВСЕГДА КАК КОНЕЦ СТРОКИ, оба обозначены как PERIOD FOR SYSTEM_TIME, темпоральная таблица связана с dbo.Таблица истории Temporal_Table_Demo_History, учитывая, что идентификация имени схемы таблицы истории является обязательной, и, наконец, включение функции SYSTEM_VERSIONING следующим образом:
ИСПОЛЬЗОВАТЬ SQLShackDemo GO СОЗДАТЬ ТАБЛИЦУ dbo.Temporal_Table_Demo ( [DempID] int NOT NULL PRIMARY KEY CLUSTERED , [9 100LAME] n 100) NOT NULL , [NumOfEmp] int NOT NULL , [TimeStart] datetime2 (2) СОЗДАЕТСЯ ВСЕГДА КАК НАЧАЛО СТРОКИ , [TimeEnd] datetime2 (2) СОЗДАВАЕТСЯ ВСЕГДА КАК КОНЕЦ СТРОКИ , ПЕРИОД. TimeStart, TimeEnd) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Temporal_Table_Demo_History)); |
Просмотрите новую темпоральную таблицу из обозревателя объектов, где вы увидите специальный значок с маленькими часами (см. Изображение ниже) для темпоральной таблицы с с системной версией между круглыми скобками. В таблице истории не будет отдельного узла таблицы; это можно показать, расширив темпоральную таблицу узлом под основной таблицей, обозначенным в скобках History . Кластерный индекс по умолчанию будет создан для таблицы истории, содержащей два столбца Period Start и Period End, как показано ниже:
Предположим, нам нужно включить управление версиями системы для существующей таблицы в нашей базе данных.Для этого необходимо добавить два столбца DateTime2, не допускающие значения NULL, для начала и конца периода со всеми спецификациями, указанными ранее, как в следующем скрипте:
ALTER TABLE dbo.AWBuildVersion ADD [TimeStart] DATETIME2 (0) СОЗДАЕТСЯ ВСЕГДА КАК СТРОКА НАЧАЛО НЕ ПУСТО ОГРАНИЧЕНИЕ DFT_AWBuildVersion_TimeStart ПО УМОЛЧАНИЮ (‘1 01 ВРЕМЯ ЗАПРЕЩАЕТСЯ 0 (‘ 1 01 ЗАПРЕЩЕНО ‘), 9EN NULL CONSTRAINT DFT_AWBuildVersion_TimeEnd DEFAULT (‘99991231 23:59:59’), PERIOD FOR SYSTEM_TIME ([TimeStart], [TimeEnd]); ИЗМЕНИТЬ ТАБЛИЦУ dbo.AWBuildVersion DROP CONSTRAINT DFT_AWBuildVersion_TimeStart, DFT_AWBuildVersion_TimeEnd; ALTER TABLE dbo.AWBuildVersion SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.AWBuildVersion_History)); |
В предыдущем сценарии ограничения по умолчанию определены, так как столбцы периода не должны допускать значения NULL, а затем отбрасываются перед включением System_Versioning, поскольку SQL Engine будет отвечать за заполнение этих двух столбцов.SQL Server Engine выполнит проверку согласованности как для временной, так и для хронологической таблицы, чтобы убедиться, что все требования схемы применяются, прежде чем включать System_Versioning. Это включает проверку того, что время окончания периода больше, чем время начала периода, и что периоды разных версий одной и той же строки не будут перекрываться. Проверка согласованности включена по умолчанию и может быть отключена с помощью оператора DATA_CONSISTENCY_CHECK = OFF в части включения System_Versioning. Теперь таблица AWBuildVersion успешно определена как темпоральная таблица:
Включение System_Versioning для таблицы не помешает вам изменить схему таблицы.Система будет удерживать блокировку схемы как для временной таблицы, так и для таблицы истории, где эти изменения будут реплицированы в таблицу истории. Определенное изменение схемы нельзя выполнить напрямую с помощью оператора ALTER DATABASE для таблицы с включенным System_Versioning, например, добавление или удаление столбцов IDENTITY, COMPUTED, SPARSE, COLUMN_SET или ROWGUIDCOL. Чтобы применить такие изменения к таблице с включенной System_Versioning, вам необходимо сначала отключить System_Versioning, выполнить необходимые изменения, а затем снова включить System_Versioning.Приведенный ниже сценарий используется для добавления нового столбца IDENTITY во временную таблицу Temporal_Table_Demo (мы не будем рассматривать этот добавленный столбец в следующей демонстрации):
ALTER TABLE dbo. [Dbo]. [Temporal_Table_Demo] SET (SYSTEM_VERSIONING = OFF); ИЗМЕНИТЬ ТАБЛИЦУ [dbo]. [Dbo]. [Temporal_Table_Demo] ADD ID int IDENTITY (1,1); ALTER TABLE dbo. [Dbo]. [Temporal_Table_Demo] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.[dbo]. [Temporal_Table_Demo_History])); |
Давайте начнем демонстрацию, чтобы изучить эту новую функцию. Сначала мы вставим 5 записей во временную таблицу Temporal_Table_Demo, используя следующий простой оператор INSERT:
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 13 14 | ИСПОЛЬЗОВАТЬ [SQLShackDemo] GO INSERT INTO [dbo].[Temporal_Table_Demo] ([DempID] , [DepName] , [DepLocation] , [NumOfEmp]) ЗНАЧЕНИЯ (1, ‘Учет’, ‘Build1’, 10) 2, «HR», «Build1», 3), (3, «Набор персонала», «Build1», 2), (4, «IT», «Build2», 7), (5, «Безопасность», «Сборка 2», 3) GO |
Запрос темпоральной таблицы для проверки вставленных строк:
ВЫБРАТЬ [DempID] , [DepName] , [DepLocation] , [NumOfEmp] , [TimeStart] , [TimeEnd] FROM [SQLShackDemo.[dbo]. [Temporal_Table_Demo] |
Результат в нашем случае будет примерно таким:
Как мы обсуждали ранее, время начала периода будет заполнено системой временем начала транзакции, а время окончания периода будет заполнено системой с максимальным значением datetime2, сохраняя записи открытыми. К таблице истории изменений не применено, так как с этими строками еще не производилось никаких действий. Если вы попытаетесь запросить его, он окажется пустым.
Если удастся удалить последнюю строку в темпоральной таблице с DempID равным 5:
УДАЛИТЬ ИЗ [SQLShackDemo]. [Dbo]. [Temporal_Table_Demo] ГДЕ DempID = 5 |
И запросив временную таблицу, мы обнаружим, что запись удалена из таблицы, что является нормальной ситуацией:
Но новое здесь заключается в том, что если мы запросим соответствующую таблицу истории:
ВЫБРАТЬ [DempID] , [DepName] , [DepLocation] , [NumOfEmp] , [TimeStart] , [TimeEnd] FROM [SQLShackDemo.[dbo]. [Temporal_Table_Demo_History] |
Мы обнаружим, что удаленная запись вставляется в таблицу истории, а время окончания периода обновляется с учетом времени начала транзакции, отмечая строку как закрытую:
Опять же, если нам удастся обновить количество сотрудников в отделе 1:
ОБНОВЛЕНИЕ [SQLShackDemo].[dbo]. [Temporal_Table_Demo] SET NumOfEmp = 11 ГДЕ DempID = 1 |
И снова запросив временную таблицу, мы обнаружим, что строка обновлена, а время начала периода также обновлено с учетом нового времени транзакции, при этом строка остается открытой:
И старая запись перед операцией UPDATE будет вставлена в таблицу истории с временем окончания периода в качестве текущего времени транзакции, закрывая строку:
Предыдущие результаты показывают нам, насколько полезна новая функция System_Versioning, поскольку она позволяет нам откатить или минимально отслеживать изменения, примененные к этой таблице, без возврата к старым файлам резервных копий для одной или нескольких записей.
Новое предложение FOR SYSTEM_TIME добавлено к оператору SELECT для запроса данных по истории и основным темпоральным таблицам, с пятью подпунктами, которые предоставляют вам множество вариантов для указания необходимого периода времени. Первое предложение — это предложение AS OF , которое возвращает значения после выполнения объединения между временной таблицей и таблицей истории и фильтрации строк, которые действительны в указанный момент времени. Строку можно считать допустимой, если значение времени начала периода меньше или равно указанному времени и что время окончания периода больше указанного времени.
Приведенный ниже оператор SELECT использует предложение FOR SYSTEM_TIME AS FOR для получения всех строк с TimeStart, меньшим или равным указанному времени, а TimeEnd больше указанного времени:
SELECT * FROM [SQLShackDemo]. [Dbo]. [Temporal_Table_Demo] FOR SYSTEM_TIME AS OF ‘2016-09-18 13: 40: 05.06’ GO |
Окончательный результат для допустимых строк после внутреннего объединения между временной таблицей и таблицей истории будет следующим:
Второе предложение — это предложение CONTAINED IN , которое возвращает все открытые и закрытые строки в пределах временного диапазона, определенного предоставленными двухпериодными значениями.Приведенный ниже оператор SELECT использует предложение FOR SYSTEM_TIME CONTAINED IN для извлечения всех строк, которые открывались и закрывались в пределах временного диапазона, указанного значениями @StartTime и @EndTime:
DECLARE @StartTime datetime2 = ‘2016-09-18 13: 40: 05.06’ DECLARE @EndTime datetime2 = ‘2016-09-18 13: 46: 03.28’ SELECT * FROM [SQLShackDemo]. [ dbo]. [Temporal_Table_Demo] ДЛЯ СИСТЕМНОГО_ВРЕМЕНИ, ВХОДЯЩЕГО В (@StartTime, @EndTime) |
Результат в нашем случае будет:
Третье предложение — это предложение FROM… TO , которое возвращает все активные строки в пределах временного диапазона, определенного двумя предоставленными значениями, независимо от активного времени начала.Объединение будет выполнено внутренне между основной темпоральной таблицей и таблицей истории для извлечения активных строк в пределах предоставленного диапазона времени. Приведенный ниже оператор SELECT использует предложение FOR SYSTEM_TIME FROM TO для извлечения всех активных строк в пределах временного диапазона, указанного значениями @StartTime и @EndTime:
DECLARE @StartTime datetime2 = ‘2016-09-18 13: 40: 05.06’ DECLARE @EndTime datetime2 = ‘2016-09-18 13:46:03.28 ‘ SELECT * FROM [SQLShackDemo]. [Dbo]. [Temporal_Table_Demo] FOR SYSTEM_TIME FROM @StartTime TO @EndTime |
Результат ниже показывает все активные записи за указанный промежуток времени:
Четвертое предложение — это предложение BETWEEN… AND , которое работает так же, как предложение FROM… TO, за исключением того, что оно возвращает только те строки, которые стали активными на нижней границе или стали неактивными на верхней границе, указанной в инструкции.Приведенный ниже оператор SELECT использует предложение FOR SYSTEM_TIME BETWEEN AND для извлечения строк, которые стали активными в @StartTime, или строк, которые стали неактивными в @EndTime:
DECLARE @StartTime datetime2 = ‘2016-09-18 13: 40: 05.06’ DECLARE @EndTime datetime2 = ‘2016-09-18 13: 46: 03.28’ SELECT * FROM [SQLShackDemo]. [ dbo]. [Temporal_Table_Demo] ДЛЯ SYSTEM_TIME МЕЖДУ @StartTime И @EndTime |
Результат запроса будет таким:
Последнее предложение — это предложение ALL , которое выполняет внутреннее объединение между строками в основной темпоральной таблице и таблице истории без указания какого-либо временного диапазона, как показано ниже:
ВЫБЕРИТЕ * ИЗ [SQLShackDemo].[dbo]. [Temporal_Table_Demo] FOR SYSTEM_TIME ALL |
Результат будет похож на:
Как и любая новая функция, представленная в SQL Server, для запроса информации об этой функции будет добавлено соответствующее DMV или свойство в DMV. Системные таблицы sys.tables можно запросить для таблиц с temporal_type, отличным от нуля, чтобы получить все таблицы с включенным System_Versioning с соответствующими таблицами истории, как показано ниже:
ВЫБРАТЬ Tab1.имя как Temporal_Table_Name, Tab2.name как History_Table_Name, Tab1.temporal_type_desc FROM sys.tables Tab1 LEFT JOIN sys.tables Tab2 ON Tab1.history_table_id = Tab2.object_id 9 ЗАКАЗАТЬ ПО Temporal_Table_Name GO |
Результат запроса покажет нам две таблицы, для которых мы включили System_Versioning с соответствующими таблицами истории:
Новый системный каталог просмотра sys.периоды могут также использоваться для вывода списка всех столбцов периодов таблиц с включенной функцией System_Versioning. Полную информацию можно получить, присоединив sys.periods к sys.tables, как в следующем запросе:
ВЫБЕРИТЕ PS.name как Period_Name, Tbl.name как Temporal_Table_Name, clms1.name как Period_Start_CName, clms2.name как Period_Enf_CName FROM sys.периоды PS INNER JOIN sys.tables Tbl ON PS.object_id = Tbl.object_id INNER JOIN sys.columns clms1 ON Tbl.object_id = clms1.object_id AND PS.start_column_id = clms1.column_id JOIN_ID clms1. НА Tbl.object_id = clms2.object_id И PS.end_column_id = clms2.column_id GO |
Результат запроса покажет нам две таблицы с включенным System_Versioning с именами столбцов Period Start и Period End:
SQL Server позволяет добавлять индексы к временным таблицам и таблицам истории для повышения производительности запроса.Предположим, что нам нужно настроить производительность следующего запроса, который очень часто выполняется в нашей системе, и любое его улучшение повлияет на общую производительность:
УСТАНОВИТЬ ВРЕМЯ ДЛЯ СТАТИСТИКИ DECLARE @StartTime datetime2 = ‘2016-09-18 13: 40: 05.06’ DECLARE @EndTime datetime2 = ‘2016-09-18 13: 46: 03.28’ SELECT * ОТ [SQLShackDemo].[dbo]. [Temporal_Table_Demo] ДЛЯ SYSTEM_TIME FROM @StartTime TO @EndTime SET STATISTICS TIME OFF |
Мы включили СТАТИСТИКУ ВРЕМЕНИ, чтобы точно узнать время выполнения запроса. Давайте запустим запрос и проверим план выполнения запроса с помощью приложения APEXSQL PLAN и времени выполнения. План выполнения запроса показывает, что сканирование кластеризованного индекса выполняется во временной таблице, поскольку в столбцах TimeStart и TimeEnd нет индекса:
И запрос занял 107 мс для полного выполнения:
Давайте создадим некластеризованный индекс по столбцам TimeStart и TimeEnd:
ИСПОЛЬЗУЙТЕ [SQLShackDemo] GO СОЗДАЙТЕ НЕКЛАСТЕРНЫЙ ИНДЕКС [IX_Temporal_Table_Demo_TStart_TEnd] НА [dbo].[Temporal_Table_Demo] ( [TimeStart] ASC, [TimeEnd] ASC ) GO |
И снова выполните запрос, план выполнения, сгенерированный с помощью приложения APEXSQL PLAN, теперь показывает нам, что сканирование кластерного индекса во временной таблице изменилось на поиск индекса:
И что время выполнения явно уменьшено до 37 мс:
Как видите, индекс, который мы создали в темпоральной таблице, повысил производительность запроса и значительно сократил время выполнения.В зависимости от рабочей нагрузки в вашей среде вы можете настроить индекс, наилучшим образом соответствующий вашим запросам, и повысить производительность вашей системы.
Заключение
Темпоральная таблица с системным управлением версиями — это новый тип таблицы, которая связана со связанной таблицей хронологии, чтобы хранить историю для каждого изменения строки, выполненного в этой таблице. Вы можете разработать собственное решение в зависимости от темпоральной таблицы для отслеживания изменений данных со временем изменения и отката любых аварийных изменений без необходимости восстановления файлов резервных копий.Вы можете получить информацию о темпоральных таблицах и столбцах периодов, используя существующие и новые системные объекты SQL Server. Хорошим моментом здесь является то, что им управляет только система, не требующая усилий с вашей стороны для определения периодов хранения и отслеживания процессов вставки или удаления в исторических таблицах. Как и любую новую функцию, тщательно протестируйте ее в тестовой среде, прежде чем применять в реальной среде.
Ахмад Ясин (Ahmad Yaseen) — инженер Microsoft по большим данным с глубокими знаниями и опытом в областях SQL BI, администрирования баз данных SQL Server и разработки.
Он является сертифицированным специалистом по решениям Microsoft в области управления данными и аналитикой, сертифицированным партнером по решениям Microsoft в области администрирования и разработки баз данных SQL, партнером разработчика Azure и сертифицированным инструктором Microsoft.
Кроме того, он публикует свои советы по SQL во многих блогах.
Посмотреть все сообщения от Ahmad Yaseen
Последние сообщения от Ahmad Yaseen (посмотреть все)
.