Insert запрос sql: INSERT | SQL | SQL-tutorial.ru

Содержание

Инструкция INSERT INTO в Transact-SQL – несколько способов добавления данных в таблицу | Info-Comp.ru

Всем привет! В данной статье речь пойдет о том, как можно добавлять данные в таблицу в Microsoft SQL Server, если Вы уже хоть немного знакомы с языком T-SQL, то наверно поняли, что сейчас мы будем разговаривать об инструкции INSERT, а также о том, как ее можно использовать для добавления данных в таблицу.

Начнем по традиции с небольшой теории.

Инструкция INSERT в T-SQL

INSERT – это инструкция языка T-SQL, которая предназначена для добавления данных в таблицу, т.е. создания новых записей. Данную инструкцию можно использовать как для добавления одной строки в таблицу, так и для массовой вставки данных. Для выполнения инструкции INSERT требуется разрешение на вставку данных (INSERT) в целевую таблицу.

Существует несколько способов использования инструкции INSERT в части данных, которые необходимо вставить:

  • Перечисление конкретных значений для вставки;
  • Указание набора данных в виде запроса SELECT;
  • Указание набора данных в виде вызова процедуры, которая возвращает табличные данные.

Заметка! Начинающим рекомендую посмотреть мой видеокурс по T-SQL.

Упрощённый синтаксис

   
   INSERT [INTO] [таблица] (список столбцов, …)
        VALUES (список значений, …)
          Или
        SELECT запрос на выборку
          Или
        EXECUTE процедура


Где,

  • INSERT INTO – это команда добавления данных в таблицу;
  • Таблица – это имя целевой таблицы, в которую необходимо вставить новые записи;
  • Список столбцов – это перечень имен столбцов таблицы, в которую будут вставлены данные, разделенные запятыми;
  • VALUES – это конструктор табличных значений, с помощью которого мы указываем значения, которые будем вставлять в таблицу;
  • Список значений – это значения, которые будут вставлены, разделенные запятыми. Они перечисляются в том порядке, в котором указаны столбцы в списке столбцов;
  • SELECT – это запрос на выборку данных для вставки в таблицу. Результирующий набор данных, который вернет запрос, должен соответствовать списку столбцов;
  • EXECUTE – это вызов процедуры на получение данных для вставки в таблицу. Результирующий набор данных, который вернет хранимая процедура, должен соответствовать списку столбцов.

Вот примерно так и выглядит упрощённый синтаксис инструкции INSERT INTO, в большинстве случаев именно так Вы и будете добавлять новые записи в таблицы.

Список столбцов, в которые Вы будете вставлять данные, можно и не писать, в таком случае их порядок будет определен на основе фактического порядка столбцов в таблице. При этом необходимо помнить этот порядок, когда Вы будете указывать значения для вставки или писать запрос на выборку. Лично я Вам рекомендую все-таки указывать список столбцов, в которые Вы планируете добавлять данные.

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

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

Хватит теории, переходим к практике.

Исходные данные

Для того чтобы добавлять данные в таблицу, нам нужна соответственно сама таблица, давайте ее создадим, и уже в нее будем пробовать добавлять записи.

Примечание! Все примеры будут выполнены в Microsoft SQL Server 2016 Express.

   
   CREATE TABLE TestTable(
        [Id] [INT] IDENTITY(1,1) NOT NULL,
        [ProductName] [VARCHAR](100) NOT NULL,
        [Price] [Money] NOT NULL
   )


Наша тестовая таблица, будет содержать перечень товаров с ценой.

Также в примерах мы будем использовать процедуру, которая возвращает табличное значение, для добавления данных в таблицу, поэтому давайте ее тоже создадим.

   
   CREATE PROCEDURE TestProcedure
   AS
   BEGIN
        SELECT ProductName, Price
        FROM TestTable
   END


Для примера она у нас будет возвращать данные из только что созданной таблицы TestTable.

Примечание!


Как Вы понимаете, чтение данного материала подразумевает наличные определенных знаний по языку T-SQL, поэтому если Вам что-то непонятно, рекомендую ознакомиться со следующими материалами:

Пример 1 – Добавляем новую запись в таблицу с использованием конструктора табличных значений

Сначала давайте попробуем добавить одну запись и сразу посмотрим на результат, т.е. напишем запрос на выборку.

   
   INSERT INTO TestTable(ProductName, Price)
           VALUES ('Компьютер', 100)

   GO

   SELECT * FROM TestTable


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

После инструкции INSERT я написал инструкцию SELECT и разделил их командой GO.

А теперь давайте представим, что нам нужно добавить несколько строк. Мы для этого напишем следующий запрос.

   
   INSERT INTO TestTable(ProductName, Price)
           VALUES ('Компьютер', 100),
                   ('Клавиатура', 20),
                   ('Монитор', 50)
   GO

   SELECT * FROM TestTable


В данном случае мы добавили три записи, т.е. три строки. После VALUES значения каждой новой строки указаны в скобочках, разделили мы их запятыми.

Пример 2 – Добавляем новые строки в таблицу с использованием запроса SELECT

Очень часто возникает необходимость добавлять много данных в таблицу, например, на основе запроса на выборку, т.е. SELECT. Для этого вместо VALUES нам всего лишь нужно указать запрос.

   
   INSERT INTO TestTable(ProductName, Price)
        SELECT ProductName, Price 
        FROM TestTable
        WHERE Id > 2
   GO

   SELECT * FROM TestTable


В данном примере мы написали запрос SELECT, который возвращает данные из таблицы TestTable, но не все, а только те, у которых идентификатор больше 2. А результат вставили все в ту же таблицу TestTable.

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

   
   INSERT INTO TestTable
           SELECT ProductName, Price 
           FROM TestTable
           WHERE Id > 2
   GO

   SELECT * FROM TestTable


В данном случае мы уверены в том, что в таблице TestTable первый столбец это ProductName, а второй Price, поэтому мы можем позволить себе написать именно так. Но, снова повторюсь, на практике лучше указывать список столбцов.

Если Вы заметили, я во всех примерах не указывал столбец Id, а он у нас есть, ошибки не возникло, так как данный столбец со свойством IDENTITY, он автоматически генерирует идентификаторы, поэтому в такой столбец вставить данные просто не получится.

Пример 3 – Добавляем новые записи в таблицу с использованием хранимой процедуры

Сейчас давайте вставим в таблицу данные, которые нам вернёт хранимая процедура. Смысл здесь такой же, вместо VALUES и вместо запроса мы указываем вызов процедуры. Но как Вы понимаете, порядок и количество столбцов, возвращаемых процедурой, должен строго совпадать со списком столбцов для вставки (даже если список столбцов не указан).

   
   INSERT INTO TestTable(ProductName, Price)
           EXEC TestProcedure

   GO

   SELECT * FROM TestTable


Надеюсь, данный материал помог Вам разобраться с инструкцией INSERT INTO, а у меня все, пока!

Нравится3Не нравится

Команда INSERT — вставка записей в базу данных

Команда INSERT вставляет записи в базу данных.
Можно вставить или одну запись, или сразу несколько.

См. также команды
SELECT,
UPDATE,
DELETE,
которые отвечают за получение, редактирование и удаление записей.

См. также команду
SELECT INTO,
которая копирует данные из одной таблицы в другую.

Синтаксис

Первый синтаксис:

INSERT INTO имя_таблицы SET поле1=значение1, поле2=значение2, поле3=значение3...

Второй синтаксис:

INSERT INTO имя_таблицы (поле1, поле2...) VALUES (значение1, значение2...)

Одновременно много записей:

INSERT INTO имя_таблицы (поле1, поле2...)
	VALUES (значение1, значение2...), (значение1, значение2...)..."

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500

Пример

Добавим с помощью первого синтаксиса
нового работника Васю с возрастом 23 и зарплатой 500:

INSERT INTO workers SET name='Вася', age=23, salary=500

Таблица workers станет выглядеть так:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500

Пример

Добавим с помощью второго синтаксиса
нового работника Васю с возрастом 23 и зарплатой 500:

INSERT INTO workers (name, age, salary) VALUES ('Вася', 23, 500)

Таблица workers станет выглядеть так:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500

Пример

Добавим одновременно
нового работника Васю с возрастом 23 и зарплатой 500
и работника Колю с возрастом 30 и зарплатой 1000:

INSERT INTO workers (name, age, salary) VALUES ('Вася', 23, 500), ('Коля', 30, 1000)

Таблица workers станет выглядеть так:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000

Пример

Давайте добавим
нового работника Васю с возрастом 23, но не указав ему зарплату.
Вместо нее вставится значение по умолчанию:

INSERT INTO workers (name, age) VALUES ('Вася', 23)

Таблица workers станет выглядеть так:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 0

Оператор INSERT в SQL, примеры

Здравствуйте, уважаемые читатели. Продолжаем изучать запросы на языке SQL, и сегодня мы затронем еще один важный оператор — INSERT SQL. Разберем примеры, связанные с этим оператором.

Введение

Напомним, что в прошлый раз мы создали базу данных и три таблицы с помощью оператора CREATE, подробнее вы можете почитать об этом здесь.

Таблицы, которые были созданы (Salespeople (Продавцы), Customers (Заказчики), Orders (Заказы)) пока что не содержат никаких данных. И, конечно, следует заполнить их данными, подходящими для каждой таблицы в отдельности.

Общая информация об INSERT в SQL

В SQL заполнение таблиц данными можно осуществить с помощью оператора INSERT INTO. В общем виде, запрос в базе данных можно представить так:

INSERT INTO имя_таблицы (список_столбцов_для_вставки) VALUES (список_вставляемых_значений)

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

INSERT INTO salespeople (snum, sname) VALUES (1001, "Колованов", "Москва")

то система, в которой выполняется этот SQL запрос, выдаст ошибку.

Примеры с оператором INSERT

Для начала мы выполним SQL запросы, которые добавят данные в наши таблицы, чтобы в следующих статьях мы могли к ним обращаться и каким либо образом взаимодействовать. Начнем с таблицы salespeople, у которой 4 столбца:

INSERT INTO salespeople (snum, sname, city, comm) VALUES
(1, "Колованов", "Москва", 10),
(2, "Петров", "Тверь", 25),
(3, "Плотников", "Москва", 22),
(4, "Кучеров", "Санкт-Петербург", 28),
(5, "Малкин", "Санкт-Петербург", 18),
(6, "Шипачев", "Челябинск", 30),
(7, "Мозякин", "Одинцово", 25),
(8, "Проворов", "Москва", 25)

Примечание: чтобы понять, правильно ли сработал запрос, нужно вывести данные таблицы. Это делается с помощью оператора SQL — SELECT (это тема следующих статей, поэтому здесь разберем кратко). Выполняем запрос:

SELECT * FROM salespeople

И получаем такую таблицу с заполненными данными:

snum sname city comm
1 Колованов Москва 10
2 Петров Тверь 25
3 Плотников Москва 22
4 Кучеров Санкт-Петербург 28
5 Малкин Санкт-Петербург 18
6 Шипачев Челябинск 30
7 Мозякин Одинцово 25
8 Проворов Москва 25

Итак, далее заполним остальные таблицы:

INSERT INTO customers (cnum, cname, city, rating, snum) VALUES
(1, "Деснов", "Москва", 90, 6),
(2, "Краснов", "Москва", 95, 7),
(3, "Кириллов", "Тверь", 96, 3),
(4, "Ермолаев", "Обнинск", 98, 3),
(5, "Колесников", "Серпухов", 98, 5),
(6, "Пушкин", "Челябинск", 90, 4),
(7, "Лермонтов", "Одинцово", 85, 1),
(8, "Белый", "Москва", 89, 3),
(9, "Чудинов", "Москва", 96, 2),
(10, "Лосев", "Одинцово", 93, 8)
INSERT INTO orders (onum, amt, odate, cnum, snum) VALUES
(1001, 128, '2016-01-01', 9, 4),
(1002, 1800, '2016-04-10', 10, 7),
(1003, 348, '2017-04-08', 2, 1),
(1004, 500, '2016-06-07', 3, 3),
(1005, 499, '2017-12-04', 5, 4),
(1006, 320, '2016-03-03', 5, 4),
(1007, 80, '2017-09-02', 7, 1),
(1008, 780, '2016-03-07', 1, 3),
(1009, 560, '2017-10-07', 3, 7),
(1010, 900, '2016-01-08', 6, 8)

На всякий случай напомню, что в таблице orders(заказы) колонка amt означает стоимость заказа, cnum — номер покупателя, snum — номер продавца, оформившего сделку.

Дополнительная информация

Если вы ввели неправильные данные в таблицу, то всю таблицу можно очистить с помощью SQL оператора TRUNCATE:

TRUNCATE TABLE orders

Если же вы хотите удалить определенную строку, то нужно воспользоваться оператором DELETE, а также указать какую то информацию, описывающую данную строку, например в salespeople это будет snum:

DELETE FROM salespeople WHERE snum = 1

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

Заключение

Итак, мы познакомились с оператором INSERT языка SQL, который вставляет данные в таблицы, на примерах сами научились это делать. На этом все, если у вас остались вопросы, то оставляйте их в комментариях.

Поделиться ссылкой:

Похожее

2.16. Добавление записей — Transact-SQL В подлиннике : Персональный сайт Михаила Флёнова

С выборкой данных мы разобрались и узнали все, что необходимо знать об операторе SELECT. Я надеюсь, что смог показать вам всю мощь выборки данных и теперь вы сможете самостоятельно писать запросы для решения своих задач.

Теперь давайте познакомимся с командами добавления данных в таблицу. Когда мы вначале главы заполняли таблицу данными, то вы должны были просто выполнить сценарий. Сейчас мы познакомимся с командой INSERT, которая добавляет в таблицу запись и вы сможете понять, как работал сценарий заполнения таблицы Chapter2/fill_data.sql.

Листинг 2.4. Общий вид команды INSERT


INSERT [ INTO] 
    { table_name WITH ( < table_hint_limited &qt; [ ...n ] ) 
        | view_name 
        | rowset_function_limited 
    } 

    {    [ ( column_list ) ] 
        { VALUES 
            ( { DEFAULT | NULL | expression } [ ,...n] ) 
            | derived_table 
            | execute_statement 
        } 
    }

В принципе, ничего сложного в этой команде нет. Давайте рассмотрим различные варианты добавления данных в таблицу. Для начала добавим в таблицу строку, в которой все значения будут установлены сервером по умолчанию:


INSERT INTO tbPeoples 
DEFAULT VALUES

Посмотрите, что добавил сервер в таблицу tbPeoples. Как? Нужно посмотреть последнюю строку, а этот запрос мы рассматривали в разделе 2.14. Напоминаю, как он выглядел:


SELECT * 
FROM tbPeoples 
WHERE idPeoples=
    (SELECT MAX(idPeoples) FROM tbPeoples)
В результате вы должны увидеть следующую теблицу:
idPeoples  vcFamil  vcName  vcSurname  idPosition  dDateBirthDay                                          
----------------------------------------------------------------
20         NULL     NULL    NULL       NULL        NULL

(1 row(s) affected)

В таблице tbPeoples первое поле ‘idPeoples’ является автоматически увеличиваемым, и новой строке это поле стало равным 20. Остальные поля не имеют значений по умолчанию и тут можно видеть только нулевые значения NULL.

Вернемся к запросу добавления записи и рассмотрим его подробнее. В данном запросе выполняется оператор INSERT INTO (вставить в), после которого указывается имя таблицы, в которую нужно вставить запись. Далее может идти описание имен полей, которые нужно заполнять или список значений. В нашем случае нет ни того, ни другого, зато есть DEFAULT VALUES (значения по умолчанию), который указывает на необходимость заполнить все поля значениями по умолчанию.

В таблице tbPeoples только у одного поля указывается значение по умолчанию – это автоматически увеличиваемое поле первичного ключа. Хотя мы не указывали DEFAULT значение, автоматически увеличиваемое поле обязательно получает значение, тем более что это первичный ключ, и он должен быть заполнен. Все остальные поля будут нулевыми.

Следующий запрос пытается добавить запись с явно указанными данными:


INSERT INTO tbPeoples 
VALUES(122, 'ИВАНОВ', 'ИВАН', 'СЕРГЕЕВИЧ', 1, '01.01.1971')

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

В данном запросе указаны все поля и указаны в соответствии со всеми типами, но почему я сказал, что этот запрос «пытается добавить строку»? Ничего в голову не приходит? Первое поле имеет тип автоматического увеличиваемого числа. Это поле изменять нельзя, поэтому сервер вернет ошибку:

An explicit value for the identity column in table ‘tbPeoples’ can only be specified when a column list is used and IDENTITY_INSERT is ON.

Явное значение для авто увеличиваемой колонки в таблице ‘tbPeoples’ может быть указано только когда используется список колонок и свойство IDENTITY_INSERT установлено в ON.

Неужели нельзя добавить строку? Конечно же, есть способ решения этой проблемы, просто необходимо явным образом задать список колонок, которые должны изменяться и установить им нужные значения.

Список колонок указывается в скобках после имени таблицы:


INSERT INTO tbPeoples 
 (idPeoples, vcFamil, vcName, vcSurname, idPosition, dDateBirthDay) 
VALUES (122, 'ИВАНОВ', 'ИВАН', 'СЕРГЕЕВИЧ', 1, '01.01.1971')

В данном случае в скобках перечислены все поля в таком же порядке, в котором они описаны в таблице tbPeoples. Но это не является обязательным. Поля могут быть в любом порядке, но в этом случае значения в скобках после ключевого слова VALUES должны идти в том же порядке, в котором вы их перечислили. Но об этом мы еще поговорим.

Но этого не достаточно. Необходимо установить нужное свойство. Мы этого пока свойства не изменяли, но это делается с помощью оператора SET. Затем идет имя свойства (IDENTITY_INSERT), имя таблицы, свойство которой нужно изменить и напоследок – значение (чаще всего ON или OFF). В виде Transact-SQL команды это выглядит следующим образом:


SET IDENTITY_INSERT tbPeoples ON

Необходимо заметить, что изменение подобных свойств относится только к Transact-SQL и MS SQL Server.

Теперь посмотрим на полную SQL команду добавления записи с явным указанием значения для автоматически увеличиваемого значения:


SET IDENTITY_INSERT tbPeoples ON
INSERT INTO tbPeoples 
(idPeoples, vcFamil, vcName, vcSurname, 
    idPosition, dDateBirthDay) 
VALUES(122, 'ИВАНОВ', 'ИВАН', 'СЕРГЕЕВИЧ', 
    1, '01.01.1971')

После выполнения команды желательно вернуть значение параметра IDENTITY_INSERT в OFF:


SET IDENTITY_INSERT tbPeoples OFF

Вот теперь команда будет выполнена корректно и новая запись будет успешно добавлена в таблицу. Но я не рекомендую вам явно указывать значение для автоматически увеличиваемого поля. Так вы можете нарушить целостность, поэтому доверьте выделение значения для IDENTITY поля серверу баз данных.

Как добавить строку, и при этом не указывать значение ключевого поля, чтобы сервер смог его установить самостоятельно? Очень просто. Дело в том, что перечислять все поля необязательно. Можно указать только те имена полей, значения которых вы хотите явно изменить. Например, в следующем запросе мы не указываем значение для ключевого поля «idPeoples»:


INSERT INTO tbPeoples 
 (vcFamil, vcName, vcSurname, idPosition, dDateBirthDay) 
VALUES('ИВАНОВ', 'ИВАН', 'АЛЕКСЕЕВИЧ', 1, '01.01.1971')

В списке полей и в списке VALUES не указывается значение для поля «idPeoples». Да и в списке значений после ключевого слова VALUES мы указываем значения, начиная с поля «vcFamil». Вместо этого, сервер самостоятельно добавит очередное значение точно так же, как когда мы добавляли строку из всех значений по умолчанию.

Давайте добавим строку, в которой укажем только фамилию работника. Для этого, в списке полей нужно указать только имя поля «vcName», а в списке значений должно быть только одно строковое значение, ведь фамилия имеет строковый тип:


INSERT INTO tbPeoples (vcFamil) 
VALUES('ПЕТРОВ')

Если в вашей программе удобнее сделать перечисление всех полей, но при этом заполняются далеко не все значения, вместо не заполняемых значений можно указать значение NULL или DEFAULT. В следующем примере, вместо фамилии и даты рождения указано ключевое слово DEFAULT и этим полям сервер установит значение по умолчанию. Для поля фамилии указывается значение NULL:


INSERT INTO tbPeoples 
 (vcFamil, vcName, vcSurname, idPosition, dDateBirthDay) 
VALUES('СЕРГЕЕВ', DEFAULT, NULL, 1, DEFAULT)

Ключевые слова DEFAULT и NULL можно указывать для любых типов полей, кроме автоматически увеличиваемого, потому что это поле не может содержать NULL и не имеет значения по умолчанию. Автоматическое увеличение к значению по умолчанию не относиться.

В перечислении можно указывать поля в любом порядке, и только те, которые необходимы. При этом в списке VALUES значения должны идти в том же порядке, в котором вы их перечисляли. Например, в следующем примере поля фамилии, имени и отчества заполняются в обратном порядке. При этом между отчеством и именем идет поле «idPosition»:


INSERT INTO tbPeoples 
 (vcSurname, idPosition, vcName, vcFamil) 
VALUES('ПЕТРОВИЧ', 12, 'СЕРГЕЙ', 'СМИРНОВ')

В разделе 2. 6 мы рассматривали, как можно использовать SELECT INTO для создания новой таблицы. Теперь давайте посмотрим, как можно импортировать данные в уже существующую таблицу, ведь SELECT INTO не может выбирать данные в таблицу, если она уже существует.

Для этого создадим новую таблицу tbPeoples2, которая будет состоять из таких же полей, как и у tbPeoples. Единственная разница, ключевое поле не будет автоматически увеличиваемым, чтобы сервер не ругался, на вставку значений в первичный ключ. Посмотрите на SQL код создания новой таблицы tbPeoples2, показан в листинге 2.5.

Листинг 2.5. Создание новой таблицы, копии tbPeoples


CREATE TABLE tbPeoples2
(
  -- Описание полей
  idPeoples2 int,
  vcFamil varchar(50),
  vcName varchar(50),
  vcSurname varchar(50),
  idPosition int, 
  dDateBirthDay datetime, 

  -- Описание ключей
  CONSTRAINT PK_idPeoples2 PRIMARY KEY (idPeoples2),
  CONSTRAINT FK_idPosition2 FOREIGN KEY (idPosition)
     REFERENCES tbPosition (idPosition), 

  -- Описание ограничений
  CONSTRAINT check_dDateBirthDay2 CHECK (dDateBirthDay<getdate())
)

Так как имена ограничений в таблице должны быть уникальными внутри базы данных, к каждому имени ограничения добавлена цифра 2. В принципе, имя таблицы тоже содержит цифру два (tbPeoples2), т.е. все соответствует тому, чему мы договорились.

Теперь посмотрим, как заполнить новую таблицу записями работников из таблицы tbPooples, и при этом взять только те записи, у которых поле «idPosition» содержит значение более или равное 10. Все достаточно просто:


INSERT INTO tbPeoples2
SELECT *
FROM tbPeoples
WHERE idPosition&qt;=10

В первой строке пишем оператор INSERT INTO и имя таблицы tbPeoples2, в которую необходимо вставить данные. Затем идет просто запрос SELECT, в котором мы получаем нужные данные из таблицы tbPeoples. Все строки, полученные с помощью этого запроса, будут добавлены в таблицу tbPeoples2.

Все так просто только потому, что обе таблицы содержат одинаковое количество полей, и типы полей совпадают. А если поля будут разными? Давайте создадим третью таблицу tbPeoples3, в которой будут только поля для хранения фамилии, имени и даты рождения.


CREATE TABLE tbPeoples3
(
  -- Описание полей
  vcFamil varchar(50),
  vcName varchar(50),
  dDateBirthDay datetime, 
)

Теперь посмотрим, как можно заполнить эту таблицу значениями:


INSERT INTO tbPeoples3
SELECT vcFamil, vcName, dDateBirthDay 
FROM tbPeoples
WHERE idPosition&qt;=10

Обратите внимание, что мы выбираем с помощью запроса SELECT только три поля и именно в таком порядке, в котором они описаны в таблице tbPeoples3. Названия полей в таблицы, и выбираемые поля могут не совпадать, но типы данных обязаны совпадать полностью, иначе выполнение запроса завершиться ошибкой. Здесь сервер не может производить автоматического преобразования, поэтому, или типы должны совпадать, или вы должны их явно преобразовывать. О явном преобразовании мы поговорим в разделе 2.21.

С помощью оператора INSERT INTO вы можете копировать данные между таблицами или даже переносить их с сервера на сервер с помощью распределенных запросов, о которых мы поговорим в разделе 5.1.

Запрос SELECT в INSERT INTO может быть любой сложности, и тут ограничений на используемые операторы нет. Другое дело, что не всегда сортировка может иметь смысл. Например, если вставлять отсортированные данные в таблицу tbPeoples, то таким образом можно повлиять только на идентификатор добавляемых строк, потому что тут автоматически увеличиваемое поле, которое генерируется последовательно. Но если бы первичный ключ был GUID полем, то сортировка потеряла бы смысл, потому что GUID поле генерируется случайным образом.

Использование операторов INSERT, UPDATE и DELETE | Windows IT Pro/RE

Иначительная часть работы многих администраторов баз данных и администраторов SQL Server состоит в обеспечении текущей работы базы данных. Сюда относится добавление, изменение и удаление данных из таблиц. Запросы на T-SQL позволяют легко выполнять эти задания. Нужно только использовать предложения INSERT, UPDATE и DELETE. Перед тем как я покажу, как применять эти предложения, вспомним несколько вещей, которые нужно сделать до начала работы.

Предварительные условия

Примеры предложений INSERT, UPDATE и DELETE, которые я использую в этой статье, запускаются на простой базе данных MyDB, содержащей несколько временных таблиц и таблицу MyTable. Таблица MyTable используется для хранения названий разных временных таблиц. Единственная цель временных таблиц — заполнить пространство. Просто присутствуя, они обеспечивают наличие данных в таблице sysobjects, которая используется в качестве источника данных для вставки данных в MyTable.

Предполагая наличие полномочий, необходимых для создания баз данных и таблиц, для запуска предложений, модифицирующих данные, можно создать MyDB, MyTable и временные таблицы при помощи файлов MyDB.sql и MyTable.sql. Эти запросы можно увидеть в листингах 1 и 2.

Для запуска запроса откройте окно запроса либо в SQL Server 2005 SQL Server Management Studio (далее SSMS), либо в SQL Server 2000 Query Analyzer и скопируйте код MyDB.sql в окно. В двух записях FILENAME замените C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATAMyDB.mdf на путь на имеющемся сервере. Выполните запрос для создания MyDB. Для разработки MyTable и временных таблиц скопируйте код в MyTable.sql в окно запроса и выполните его.

Перед тем как приступать к работе с данными любой таблицы, нужно ознакомиться с ее структурой. Для этого открываем таблицу MyTable и выполняем следующие действия.

Добавление одной записи

Стандартное предложение INSERT, которое добавляет одиночную запись (или строку) в таблицу, состоит из трех частей и имеет вид

INSERT INTO Part1 (Part2) VALUES (Part3)

В части 1 определена целевая таблица, которая будет содержать новую запись. В части 2 перечисляются названия полей в целевой таблице, для которой имеются данные. Нужно заключить перечень в круглые скобки и использовать запятые для отделения названий полей. В части 3 обеспечивается добавление данных. Когда надо будет установить фактические значения данных, используется параметр VALUES и следующие за ним значения. Требуется заключить перечень значений данных в круглые скобки и отделять значения запятыми. Если это значение символьное, вроде строки или даты, его также нужно заключить в одинарные кавычки (‘‘). Например, выполнение следующего предложения вставляет значения данных TestTable и 2007–09–22 в поля ObjectName и Creation-Date таблицы MyTable, соответственно:

INSERT INTO MyTable (ObjectName, CreationDate) VALUES (‘TestTable’, ‘007–09–22’)

Те, кто уже знает мои приемы работы с таблицей MyTable, возможно, заметили, что я просто установил два или три поля в предложение INSERT. Первое поле — это поле идентификатора, которое имеет специальное назначение. Данные этого поля добавляются автоматически, и его значения увеличиваются с каждой новой вставленной записью. Это важное свойство SQL Server, о котором нужно знать. Чтобы узнать больше о типах идентификационных данных, загляните в SQL Server Books Online (BOL) в раздел IDENTITY (Свойство) на msdn2.microsoft.com/en-us/library/ms186775.aspx.

Чтобы просмотреть вновь вставленную запись, выполните следующее предложение:

SELECT * FROM MyTable

На рисунке 1 показано, как выглядит результат.

Добавление результатов предложением SELECT

Я уже показывал, как получить данные из базы данных, используя предложение SELECT. Можно задействовать оператор INSERT для сохранения данных, извлеченных предложением SELECT, в таблицу. Как и оператор INSERT для отдельной записи, оператор INSERT, который сохраняет результаты предложения SELECT, имеет три части: заданная база данных (часть 1), названия полей (часть 2) и данные (часть 3). Тем не менее вместо параметра VALUES для определения актуальных значений данных в части 3 используется предложение SELECT, которое извлекает данные из другого источника. Например, когда выполняется к базе данных MyDB, запрос

INSERT INTO MyTable (ObjectName, CreationDate) SELECT name, crdate FROM sysobjects WHERE type = ‘U’ ORDER BY name

вставляет в новую таблицу MyTable записи, содержащие название и дату разработки всех пользовательских таблиц в MyDB, упорядоченных в алфавитном порядке в соответствии с названиями. Таким образом, предполагая, что выполнено предложение INSERT с одиночной записью, описанное ранее, результаты этого запроса должны выглядеть так же, как и результаты, показанные на рисунке 2, с двумя исключениями. Значения CreationDate для MyTable и временных таблиц будут содержать дату и время запуска MyTable.sql. Второе поле ObjectName будет шире. Я сократил его из-за недостатка места.

На рисунке 2 TestTable — только первая запись. Имя условия ORDER BY только обращается к новым записям, которые вставляет в данный момент оператор SELECT. Таблица TestTable была предварительно дополнена при помощи оператора, состоящего из единичной записи оператора INSERT.

Можно использовать любой оператор SELECT, до тех пор пока типы данных в полях, перечисленных в части 2 оператора INSERT, соответствуют полям, определенным в предложении SELECT. Это дает возможность собрать все типы данных. Тем не менее используйте новое знание с осторожностью, чтобы не вставить миллионы записей на занятый сервер или на сервер с ограниченным дисковым пространством.

Модернизация данных

Теперь, когда мы умеем добавлять данные, давайте посмотрим, как работает оператор UPDATE. Простой оператор UPDATE обычно состоит из трех частей:

UPDATE Part1 SET Part2 WHERE Part3

В части 1 определена целевая таблица. В части 2 определены поля, которые должны быть изменены, вместе с новыми данными для каждого поля. Часть 3 не является обязательной, но в большинстве случаев она очень важна. Здесь устанавливается фильтр, использующий оператор WHERE. Если оператор WHERE не установлен, будет изменена каждая единичная запись в таблице. Например, запрос

UPDATE MyTable SET CreationDate = ‘2007–09–23’

изменяет значение CreationDate для каждой записи в таблице MyTable, как показано на рисунке 3. На рисунке видно, что значение CreationDate — это 2007–09–23 00:00:00.000, а не 2007–09–23, как указано в запросе. Так как тип данных поля CreationDate определен как дата и запрос не указывает временную часть, SQL Server допускает, что имеется в виду полночь, и добавляет 00:00:00.000.

Теперь используем оператор WHERE для изменения полей ObjectName и CreationDate выбранной записи:

UPDATE MyTable SET ObjectName = ‘PartyTime’, CreationDate = ‘1999–12–31 23:00:00’ WHERE TableID = 1

Как показано на рисунке 4, только первая запись (установленная посредством WHERE TableID = 1) изменена с новым названием таблицы PartyTime и новой датой разработки 1999–12–31 23:00:00.

Удаление данных

Каждый администратор баз данных опасается, что предложение DELETE попадет не в те руки. Хотя оно может быть использовано неправильно, оно играет важную роль, когда запросы применяются для изменения данных в таблицах. Типичное предложение DELETE обычно состоит из двух частей:

DELETE Part1
WHERE Part2

В части 1 определяется целевая таблица. В части 2 определяется фильтр, использующий оператор WHERE. Как и оператор WHERE в предложении UPDATE, условие WHERE в выражении DELETE необязательно, но в большинстве случаев необходимо. Если не будет включен оператор WHERE и фильтр, будут удалены все записи в заданной таблице.

Например, нужно удалить из таблицы MyTables все записи с датой разработки ранее 22 сентября 2007 года.

Запрос

DELETE MyTable WHERE CreationDate > ‘2007–09–22’

Приведет к результату, показанному на рисунке 5. Нужно быть внимательным во время изменения данных при помощи предложений DELETE или UPDATE. Оператор WHERE используется всегда, кроме случая, когда надо удалить из таблицы все данные.

 Если неизвестно, сколько записей нужно удалить, выполняется предложение SELECT с тем же оператором WHERE. Вместо определения полей в предложении SELECT задается оператор COUNT (*), возвращающий количество строк, которые должны быть удалены. Например, чтобы проверить результат последнего выражения с предложением DELETE, можно выполнить:

SELECT COUNT (*) FROM MyTable WHERE CreationDate > ‘2007–09–22’

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

Изучите свои данные

Если вы уверены в том, что теперь сможете изменять данные в MyTable, попробуйте выполнить операторы INSERT, UPDATE и DELETE в существующей базе данных на тестовом сервере. Для этого скопируйте код из запроса ExistingDatabaseQuery.sql (см. листинг 3) в окно запроса, поместите MyDB в первой строке к названию существующей базы данных и выполните запрос.

Затем можно переработать примеры из предложений INSERT, UPDATE и DELETE к имеющейся конфигурации и выполнить их. Таким образом вы узнаете, как лучше использовать эти предложения. Возможно, обнаружатся данные, о существовании которых ранее не было известно.

Билл Макэвой ([email protected]) — руководитель и администратор базы данных сайта Cooking with SQL Web

Поделитесь материалом с коллегами и друзьями

Добавление данных, оператор insert

Для добавления новых записей в таблицу предназначен оператор INSERT.

Общая структура запроса с оператором INSERT
INSERT INTO имя_таблицы [(поле_таблицы, ...)]
VALUES (значение_поля_таблицы, ...)
| SELECT поле_таблицы, ... FROM имя_таблицы ...

В описанной структуре запроса необязательные параметры указаны в квадратных скобках. Вертикальной чертой обозначен альтернативный синтаксис.

Значения можно вставлять перечислением с помощью слова values, перечислив их в круглых скобках через запятую или c помощью оператора select. Таким образом, добавить новые записей можно следующими способами:

INSERT INTO Goods (good_id, good_name, type)
VALUES (5, 'Table', 2);
INSERT INTO Goods VALUES (5, 'Table', 2);
INSERT INTO Goods 
SELECT good_id, good_name, type FROM Goods where good_name = 2;

Первичный ключ при добавлении новой записи

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

При добавлении новой записи с уникальными индексами выбор такого уникального значения может оказаться непростой задачей. Решением может быть дополнительный запрос, направленный на выявление максимального значения первичного ключа для генерации нового уникального значения.

INSERT INTO Goods SELECT COUNT(*) + 1, 'Table', 2 FROM Goods;
MySQL

В MySQL введен механизм его автоматической генерации. Для этого достаточно снабдить первичный ключ good_id атрибутом AUTO_INCREMENT. Тогда при создании новой записи в качестве значения good_id достаточно передать NULL или 0 — поле автоматически получит значение, равное максимальному значению столбца good_id, плюс единица.

CREATE TABLE Goods (
	good_id INT NOT NULL AUTO_INCREMENT
	...
 );
INSERT INTO Goods VALUES (NULL, 'Table', 2);
PostgreSQL

В PostgreSQL есть схожий механизм для автоматической генерации уникального идентификатора. Для этого он имеет типы SMALLSERIAL SERIAL BIGSERIAL, которые не являются настоящими типами, а скорее просто удобством записи столбцов с уникальным идентификатором. Столбец с одним из вышеперечисленных типов будет являться целочисленным и автоматически увеличиваться при добавление новой записи.

CREATE TABLE Goods (
	good_id SERIAL
	...
 );
INSERT INTO Goods (good_name, type) VALUES ('Table', 2);

Генерация SQL-запросов в Go с помощью squirrel

В рамках поста Работа с PostgreSQL в языке Go при помощи pgx был написан микросервис, использующий SQL-запросы в виде обыкновенных строк. Безусловно, это единственный правильный способ работать с РСУБД, однако в некоторых задачах он может быть не очень удобен. Например, если вам нужно генерировать запросы со сложными WHERE-условиями в зависимости от пользовательского ввода. Одно из возможных решений заключается в использовании библиотеки squirrel.

Не будем ходить вокруг да около, и просто перепишем наши запросы на белочку.

SELECT-запрос:

    // …
    sql, args, err := sq.Select(«id», «name», «phone»).
                        From(«phonebook»).
                        Where(sq.Eq{«id»: id}).
                        PlaceholderFormat(sq.Dollar).
                        ToSql()
    if err != nil {
        log.Errorf(«Unable to build SELECT query: %v», err)
        w.WriteHeader(500)
        return
    }
    log.Infof(«Executing SQL: %s», sql)
    row := conn.QueryRow(context.Background(), sql, args…)
    // …

INSERT-запрос:

    // …
    sql, args, err := sq.Insert(«phonebook»).
                        Columns(«name», «phone»).
                        Values(rec.Name, rec.Phone).
                        Suffix(«RETURNING id»).
                        PlaceholderFormat(sq.Dollar).
                        ToSql()
    if err != nil {
        log.Errorf(«Unable to build INSERT query: %v», err)
        w.WriteHeader(500)
        return
    }
    log.Infof(«Executing SQL: %s», sql)
    row := conn.QueryRow(context.Background(), sql, args…)
    // …

UPDATE:

    // …
    sql, args, err :=  sq.Update(«phonebook»).
                        Set(«name», rec.Name).
                        Set(«phone»,  rec.Phone).
                        Where(sq.Eq{«id»: id}).
                        PlaceholderFormat(sq.Dollar).
                        ToSql()
    if err != nil {
        log.Errorf(«Unable to build UPDATE query: %v», err)
        w.WriteHeader(500)
        return
    }
    log.Infof(«Executing SQL: %s», sql)
    ct, err := conn.Exec(context.Background(), sql, args…)
    // …

И, наконец, DELETE:

    // …
    sql, args,  err := sq.Delete(«phonebook»).
                        Where(sq.Eq{«id»: id}).
                        PlaceholderFormat(sq.Dollar).
                        ToSql()
    if err != nil {
        log.Errorf(«Unable to build DELETE query: %v», err)
        w.WriteHeader(500)
        return
    }
    log.Infof(«Executing SQL: %s», sql)
    ct, err := conn.Exec(context.Background(), sql, args…)
    // …

Собираем проект, запускаем тесты, и проверяем, что ничего не сломалось. Также смотрим, что за запросы в итоге были сгенерированы:

SELECT id, name, phone FROM phonebook WHERE id = $1;
INSERT INTO phonebook (name,phone) VALUES ($1,$2) RETURNING id;
UPDATE phonebook SET name = $1, phone = $2 WHERE id = $3;
DELETE FROM phonebook WHERE id = $1;

Выглядит законно.

Конечно, в таком простом проекте использовать squirrel лишено всякого смысла. Он только замедляет исполнение программы. Но идея, ровно как и польза в более сложных случаях, должна быть понятна. Дополнительную информацию вы найдете в репозитории squirrel, а также в документации проекта на go.dev.

Метки: Go, СУБД.

Оператор SQL INSERT INTO — с примерами

Как добавить новые записи в таблицу?

Оператор INSERT INTO используется для добавления новых данных в базу данных.
INSERT INTO добавляет новую запись в таблицу.

INSERT INTO может содержать значения для некоторых или всех своих столбцов.
INSERT INTO можно комбинировать с SELECT для вставки записей.

Синтаксис SQL INSERT INTO

Общий синтаксис:

INSERT INTO имя-таблицы (имена столбцов)
ЗНАЧЕНИЯ (значения)
 

КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Примеры SQL INSERT INTO

Проблема : Добавить нового клиента в базу данных

ВСТАВИТЬ клиента (имя, фамилия, город, страна, телефон)
ЦЕННОСТИ («Крейг», «Смит», «Нью-Йорк», «США», 1-01-993 2800)
 

Результат: Добавлена ​​1 новая запись


КЛИЕНТ
Идентификатор
Имя
Фамилия
Город
Страна
Телефон

Проблема : Добавить нового клиента по имени Анита Коутс в базу данных

ВСТАВИТЬ клиента (имя, фамилия)
ЦЕННОСТИ («Анита», «Пальто»)
 

Результат: Добавлена ​​1 новая запись


SQL INSERT в сочетании с SELECT

Общий синтаксис:

INSERT INTO имя-таблицы (имена столбцов)
ВЫБЕРИТЕ имена столбцов
  ОТ имя-таблицы
 ГДЕ условие
 

ПОСТАВЩИК
Идентификатор
Название компании
Контактное имя
Город
Страна
Телефон
Факс

Id

КЛИЕНТ
Имя
Фамилия
Город
Страна
Телефон

SQL INSERT INTO

с SELECT Пример

Проблема : Поставщик пивоварни Bigfoot имеет
также стать клиентом.Добавить клиента
запись со значениями из таблицы поставщиков.

ВСТАВИТЬ клиента (имя, фамилия, город, страна, телефон)
ВЫБРАТЬ ВЛЕВО (ContactName, CHARINDEX ('', ContactName) - 1),
       ПОДСТРОКА (ContactName, CHARINDEX ('', ContactName) + 1, 100),
       Город, Страна, Телефон
  ОТ поставщика
 ГДЕ CompanyName = 'Bigfoot Breweries'
 

Примечание. ContactName разбирается на FirstName и LastName.
Разбор осуществляется с помощью встроенных функций: LEFT, SUBSTRING и CHARINDEX.

Результат: Добавлена ​​1 новая запись

SQL INSERT — вставить одну или несколько строк в таблицу

Резюме : в этом руководстве вы узнаете, как использовать оператор SQL INSERT для вставки данных в таблицы.

Оператор INSERT вставляет одну или несколько строк в таблицу.Оператор INSERT иногда называют оператором INSERT INTO .

Оператор SQL INSERT — вставить одну строку в таблицу

Ниже показан оператор INSERT , который вставляет одну строку в существующую таблицу.

INSERT INTO table (column1, column2, …)

VALUES (value1, value2, …);

Чтобы вставить строку в таблицу, вам необходимо указать три вещи:

  • Во-первых, таблица, в которую вы хотите вставить новую строку, в предложении INSERT INTO .
  • Во-вторых, список столбцов в таблице, разделенных запятыми, окруженный круглыми скобками.
  • В-третьих, список значений, разделенных запятыми, заключенный в круглые скобки в предложении VALUES .

Список столбцов должен иметь такое же количество элементов, что и список значений, в противном случае ядро ​​базы данных выдаст ошибку.

Давайте взглянем на следующую таблицу грузоотправителей :

Следующий оператор INSERT вставляет новую строку в таблицу грузоотправителей :

ВСТАВИТЬ INTO грузоотправителей (название компании, телефон)

ЦЕННОСТИ («Грузоотправители Альянса», «1-800-222-0451»);

Две константы: 'Alliance Shippers' и '1-800-222-0451' указаны в пункте VALUES .Механизм базы данных вставил их в столбцы companyname и phone соответственно.

После выполнения оператора сервер базы данных возвращает сообщение, чтобы указать количество затронутых строк. В этом случае мы получаем сообщение «1 строка затронута», информирующее о том, что новая строка была успешно вставлена.

Обратите внимание, что мы не указали столбец shipperID в списке столбцов, поскольку столбец shipperID является столбцом AUTO INCREMENT , механизм базы данных автоматически генерирует следующую последовательность для него всякий раз, когда новая строка вставляется в Таблица.

Чтобы помочь вам писать меньше кода, SQL предоставляет более короткую форму инструкции INSERT следующим образом:

INSERT INTO table

VALUES (value1, value2, ...)

В этой форме список значений должен иметь тот же порядок, что и список столбцов в таблице. Если вы используете эту форму инструкции INSERT , вы должны указать значения для всех столбцов, кроме столбца AUTO INCREMENT .

Рекомендуется использовать имена столбцов в операторе INSERT , чтобы упростить сопровождение кода.

Следующий оператор INSERT имеет тот же эффект, что и предыдущий:

INSERT INTO shippers

VALUES («Alliance Shippers», «1-800-222-0451»);

Оператор SQL INSERT - вставить несколько строк в таблицу

Оператор INSERT также позволяет вставлять несколько строк в таблицу с помощью одного оператора, как показано ниже:

INSERT INTO имя_таблицы (столбец1, столбец2…)

ЗНАЧЕНИЯ (значение1, значение2,…),

(значение1, значение2,…),

В этой форме вам необходимо предоставить несколько списков значений, каждый список разделяется запятой.

Следующий оператор INSERT вставляет две строки в таблицу shippers:

INSERT INTO shippers (companyName, phone)

VALUES (‘UPS’, ‘1-800-782-7892’ ),

(‘DHL’, ‘1-800-225-5345’)

Оператор SQL INSERT — копирование данных таблицы

Вместо указания списка значений вы можете использовать оператор SELECT для выбора значений из другой таблицы и передайте их в оператор INSERT .Это позволяет копировать данные из таблицы в другую таблицу.

Следующий оператор показывает, как скопировать данные из another_table в таблицу :

INSERT INTO table (column1, column2, …)

SELECT

column1, column2 ,. ..

FROM

another_table

WHERE

condition

Список столбцов в предложении SELECT должен соответствовать списку столбцов в предложении INSERT INTO .Если вы хотите скопировать только частичные данные, вам необходимо указать условие в предложении WHERE.

Предположим, у вас есть временная таблица с именем shippers_tmp , которая имеет ту же структуру, что и таблица shippers . Чтобы скопировать данные из таблицы shippers в таблицу shippers_tmp , используйте следующую инструкцию:

INSERT INTO shippers_tmp (shipperid, name, phone)

SELECT

phoneid, companyName, phoneName

ОТ

грузоотправителей

В этом руководстве вы узнали, как использовать оператор INSERT для вставки одной или нескольких строк в таблицу.Кроме того, вы также узнали, как копировать данные из таблицы в другую таблицу с помощью оператора INSERT SELECT INTO .

  • Было ли это руководство полезным?
  • Да Нет

Оператор SQL INSERT для SQL Server

Оператор INSERT используется для добавления строк в таблицу данных SQL Server. В этой статье мы исследуем, как использовать оператор INSERT. Мы обсуждаем передовой опыт, ограничения и подводим итоги на нескольких примерах.

Это вторая статья из серии статей.Первый — Введение в операторы изменения данных SQL Server.

Все примеры для этого урока основаны на Microsoft SQL Server Management Studio и базе данных AdventureWorks2012. Правильно ли вы Приступая к работе с SQL Server ? Если нет, сделайте это с помощью бесплатных инструментов, используя мое бесплатное руководство.

Прежде чем мы начнем

Хотя в этой статье в качестве примеров используется база данных Adventure Works, я решил создать примерную таблицу для использования в базе данных, чтобы лучше проиллюстрировать примеры.Здесь вы можете найти скрипт, который вам понадобится для запуска.

Базовая структура оператора SQL INSERT

Основная цель оператора INSERT — добавить строки в таблицу. Хотя оператор вставки вставляет данные из многих источников, таких как буквальные значения или исходные значения, основной формат остается тем же.

Оператор SQL INSERT состоит из трех компонентов :

  1. Таблица получает новые строки.
  2. Столбцы для заполнения
  3. Исходные данные для новых строк.

Общий формат заявления на вставку IS:

 INSERT INTO tableName 
(column1, column2,…)
VALUES (value1, value2,…)

Сейчас мы сделаем несколько примеров вставок, поэтому, если вы еще этого не сделали, запустите сценарий, чтобы создать таблицу esqlSalesPerson.

SQL INSERT INTO — вставка одной строки

В этом примере мы вставляем одну строку в таблицу esqlSalesPerson. Вот его структура таблицы:

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

 ВСТАВИТЬ В dbo.esqlSalesPerson 
(FullName, SalesLastYear,
City, rowguid)
VALUES ('George Hitson', NULL,
'Midland', '794310D2-6293-4259-AC11-71D96689A3DD')

Обратите внимание, что мы не указали SalesPersonID в списке столбцов. Это столбец идентификаторов, который заполняется автоматически.

Вы можете переключаться между столбцами; они не должны быть в порядке. Также обратите внимание, что указаны не все столбцы:

 ВСТАВИТЬ В dbo.esqlSalesPerson 
(City, FullName,
rowguid)
VALUES ('Traverse City', 'Donald Sax',
'F6E26EFD-5838-40F8-ABB3-D487D2932873')

Создает следующую строку:

Обратите внимание, что, поскольку SalesLastYear не указан, он равен NULL:

Заключите значения столбцов в круглые скобки. Это представляет собой одну строку данных. Чтобы вставить более одной строки, просто включите другой набор значений столбца. Просто не забудьте разделить каждый набор запятой, как показано ниже:

 ВСТАВИТЬ В dbo.esqlSalesPerson (City, FullName, rowguid) 
ЗНАЧЕНИЯ ( 'Bay City', 'Ralph Gitter',
'DED7DB59-7149-47DD-8D8F-D5FCFFF11124' ),
',
' 94600A1E-DD83-4ACE-9D59-8CD727A2C83E ')

Прежде чем мы продолжим более сложный пример, важно сделать шаг назад и рассмотреть поведение оператора SQL INSERT и некоторые передовые методы.

Соображения

Замечания по типу данных (заполнение)

Имейте в виду, что при вставке данных в столбцы с типом данных CHAR, VARCHAR или VARBINARY заполнение или усечение данных зависит от параметра SET ANSI_PADDING.

Вставка значения «Kris» в поле, определенное как CHAR (10), приводит к значению, заполненному шестью дополнительными пробелами. Введено значение «Kris». Правило заполнения может сбивать с толку при использовании INSERT INTO, поэтому, пожалуйста, ознакомьтесь с этой статьей, чтобы узнать подробности.

Обработка ошибок

Вы можете обрабатывать ошибки при выполнении инструкции INSERT INTO с помощью конструкции TRY… CATCH.

Есть несколько распространенных причин, по которым оператор INSERT может не работать.Вот некоторые из наиболее распространенных:

  • Нарушение уникального ключа — вы пытаетесь вставить запись в таблицу, которая приводит к дублированию значения ключа.
  • Нарушение первичного ключа — вы пытаетесь вставить запись в таблицу, в которой уже есть строка с таким же первичным ключом.
  • Нарушение внешнего ключа — вы пытаетесь вставить строку в «дочернюю» таблицу, но «родительская» не существует.
  • Преобразование типа данных — Вы пытаетесь вставить строку, в которой одно из значений не может быть правильно преобразовано в соответствующий тип данных столбца.

В этих случаях выполнение оператора INSERT останавливается, и INSERT генерирует ошибку. В таблицу не вставляются строки, даже строки

Это поведение «все или ничего» можно изменить для устранения арифметических ошибок. Рассмотрим деление на нулевую ошибку.

 ВСТАВИТЬ В myNumbers (x, y) 
ЗНАЧЕНИЯ (10/0, 5),
(10/5, 2),
(10/2, 5)

Выдает ошибку, если для SET ARITHABORT установлено значение ON. В этом случае вставка останавливается, строки не вставляются и выдается ошибка.

Однако, если для SET ARITHABORT установлено значение OFF, а для ANSI_WARNINGS установлено значение OFF, то тот же оператор будет успешно завершен. В случае математической ошибки результат заменяется на NULL.

Например,

 ВЫКЛЮЧИТЬ ARITHABORT 
ВЫКЛЮЧИТЬ ANSI_WARNINGS
ВСТАВИТЬ В myNumbers (x, y)
ЗНАЧЕНИЯ (10/0, 5),
(10/5, 2),
(10/2, 5)

добавляет три строки со значениями

При добавлении строк в таблицы важно понимать, что есть некоторые столбцы, требующие особой обработки.

INSERT SELECT и уникальные идентификаторы

При добавлении данных в столбец, объявленный с типом uniqueidentifier, используйте функцию NEWID (), чтобы сгенерировать глобально уникальное значение.

В качестве примера

 INSERT INTO dbo.esqlSalesPerson 
(City, FullName, rowguid)
VALUES ('Traverse City', 'Donald Sax', NEWID ())

Вставляет новую строку в esqlSalesPerson. Если вы запустите команду еще раз, будет добавлена ​​еще одна строка, но значение rowguid будет другим.

NEWID () генерирует новое значение при каждом вызове.

Свойство столбца идентификаторов

Новое значение генерируется для столбца всякий раз, когда строка вставляется в таблицу со свойством столбца идентификации. По этой причине, поскольку esqlSalesPerson.SalesPersonID является столбцом идентификаторов, мы не указываем его в нашем операторе INSERT. Каждый раз, когда добавляется строка, значение идентификатора увеличивается на единицу.

Если вы попытаетесь вставить строку, используя собственное значение, вы получите ошибку.

Оператор INSERT

 ВСТАВИТЬ В dbo.esqlSalesPerson 
(SalesPersonID, City, FullName, rowguid)
ЗНАЧЕНИЯ (9999, 'Traverse City', 'Donald Sax', NEWID ())

Выдает ошибку

 Невозможно вставить явное значение для столбца идентификаторов в таблицу 'esqlSalesPerson', если для IDENTITY_INSERT установлено значение OFF. 

Чтобы обойти это, вы можете УСТАНОВИТЬ IDENTITY_INSERT НА

 УСТАНОВИТЬ IDENTITY_INSERT esqlSalesPerson ON; 
ВСТАВИТЬ В dbo.esqlSalesPerson
(SalesPersonID, City, FullName, rowguid)
ЗНАЧЕНИЯ (9999, 'Traverse City', 'Donald Sax', NEWID ())

Работает без ошибок.

Значения по умолчанию и прочее

При вставке строк, любые столбцы, которые не указаны, получают значение от СУБД; в противном случае строка не может быть загружена.

СУБД автоматически предоставляет значения для столбцов, если:

  • столбец является столбцом IDENTITY (см. Выше)
  • задано значение по умолчанию, и никакое другое значение не указано.
  • столбец допускает значение NULL. В этом случае он установлен в NULL.
  • Колонна коммутируемая. Здесь используется расчет.

Если значение не указано в инструкции и механизм не может предоставить значение, строка не может быть вставлена. Обычно это происходит, если значение отсутствует, а столбец НЕ ПУСТОЙ.

Вставка данных из других таблиц

Вы также можете использовать оператор INSERT INTO SELECT для вставки одной или нескольких строк из одной таблицы в другую.Результаты SELECT подаются во INSERT INTO.

Общая форма

 INSERT INTO targetTable (column1, column2,…) 
SELECT (column1, column2,…)
FROM sourceTable

Предположим, менеджер по продажам Adventure Works хочет создать таблицу SalesPerson и включать в нее только продавцов, чьи прошлогодние продажи превысили 1 000 000 долларов.

Чтобы заполнить эту таблицу, вы можете запустить следующий INSERT SELECT:

 ВСТАВИТЬ В esqlSalesPerson 
(FullName, SalesLastYear, rowguid)
SELECT P.FirstName + '' + P.LastName, S.SalesLastYear, NEWID ()
FROM Sales.SalesPerson S
INNER JOIN Person.Person P
ON P.BusinessEntityID = S.BusinessEntityID
ГДЕ S.SalesLastYear> 1000000

Для того, чтобы это работало правильно, столбцы, возвращаемые оператором SELECT, должны быть в том же порядке, что и указанный в списке столбцов INSERT. В этом примере обратите внимание, что rowguid является обязательным полем. Чтобы заполнить это значение, мы используем функцию NEWID ().

Вы также можете использовать обычное табличное выражение для определения строк для вставки.

Вы также можете записать пример как CTE (общее табличное выражение):

 WITH topSalesPerson (FullName, SalesLastYear, rowguid) 
AS (
SELECT P.FirstName + '' + P.LastName, S.SalesLastYear, NEWID ()
ОТ Sales.SalesPerson S
INNER JOIN Person.Person P
ON P. BusinessEntityID = S.BusinessEntityID
, ГДЕ S.SalesLastYear> 1000000)
INSERT INTO esqlSalesPerson
(FullName, SalesLastYear, rowguid)
SELECT FullName, SalesLastYear, rowguid
FROM topSalesPerson

Хотя там больше набора текста, мне нравится метод CTE.Я думаю, это упрощает чтение инструкции INSERT.

Помните, что при использовании оператора SELECT для вставки данных в другую таблицу рекомендуется сначала просто запустить оператор SELECT, чтобы убедиться, что вы выбираете правильные строки. Кроме того, всегда разрабатывайте и тестируйте свой код! Я настоятельно рекомендую использовать копию вашей базы данных для разработки.

Заявление SQL INSERT

Оператор SQL INSERT добавляет новые записи в таблицы или вставляет данные в таблицы SQL. Синтаксис оператора INSERT в SQL Server —

.

 - синтаксис SQL Server INSERT
ВСТАВИТЬ В [Таблицу назначения] ([Столбец1], [Столбец2] ,..., [СтолбецN])
ЗНАЧЕНИЯ ([Column1_Value], [Column2_Value], ..., [ColumnN_Value]) 
  • Таблица назначения: Полностью соответствует имени таблицы для вставки записей
  • Столбец1… ..ColumnN: Выберите количество столбцов в таблицах.
  • Column1_Value… ..ColumnN_Value: Значения, которые вы хотите вставить. Например, Column1_Value вставлено для Column1. Если вы опускаете имена полей, вы должны указать column_values ​​(значения полей) в порядке, определенном структурой целевой таблицы

Мы можем записать этот оператор вставки сервера Sql как,

 - синтаксис SQL Server INSERT
ВСТАВИТЬ В [Таблицу назначения]
ЗНАЧЕНИЯ ([Column1_Value], [Column2_Value] ,..., [ColumnN_Value]) 

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

Пример инструкции SQL INSERT

Этот пример инструкции Insert вставляет новую запись в таблицу [SQL Insert] более традиционным способом. Здесь мы не вставили значение идентификатора, потому что это столбец идентификатора, и он будет обновлен автоматически

 - Пример вставки SQL Server
ИСПОЛЬЗУЙТЕ [Учебное пособие по SQL]
ИДТИ

INSERT INTO [dbo]. [SQL Insert] (
[Имя], [Фамилия], [Род занятий], [Годовой доход], [Продажи])
ЗНАЧЕНИЯ («Учебник», «Шлюз», «Образование», 10000, 200) 

Если мы вставляем данные для всех столбцов, мы можем игнорировать имена столбцов целевой таблицы (синтаксис 2).Это означает, что приведенный выше оператор вставки SQL Server может также записываться как:

 - Пример инструкции SQL Insert
INSERT INTO [dbo]. [SQL Insert]
ЗНАЧЕНИЯ ('SQL', 'Программирование', 'База данных', 50000, 1800) 

СОВЕТ: Игнорировать имена столбцов — не лучшая практика. Поэтому всегда указывайте имена столбцов в SQL Server.

Вышеупомянутый запрос T-SQL вставит данные в столбцы [FirstName], [LastName], [Occupation], [YearlyIncome] и [Sales]. Всякий раз, когда вы опускаете имена полей, вы должны указывать column_values ​​(значения полей) в порядке, определенном структурой целевой таблицы.Это означает, что значение SQL будет вставлено в столбец [FirstName] и т. Д.

Как вставить несколько записей в таблицу?

Этот пример инструкции вставки сервера Sql вставляет несколько записей в таблицу [SQL Insert] более традиционным способом.

 - Пример инструкции вставки SQL Server
INSERT INTO [dbo]. [SQL Insert]
ЦЕННОСТИ («Вират», «Кохли», «Сверчок», 15700, 800)
INSERT INTO [dbo]. [SQL Insert]
ЦЕННОСТИ ('Рохит', 'Шарма', 'Крикет', 15000, 500) 

Самый старый способ вставить несколько записей в таблицу [SQL Insert].

 - Пример инструкции вставки SQL Server
INSERT INTO [dbo]. [SQL Insert]
ВЫБЕРИТЕ 'John', 'Levi', 'Professional', 75700, 1900
СОЮЗ ВСЕ
ВЫБЕРИТЕ «Лань», «Мартин», «Менеджмент», 95000, 5600 

Здесь мы используем самый популярный способ вставки нескольких записей в таблицу [SQL Insert]. Этот оператор вставки SQL будет работать в SQL Server 2008 и более поздних версиях

.

 - Пример инструкции SQL Insert
INSERT INTO [dbo]. [SQL Insert]
ЦЕННОСТИ (Имран, Хан, Опытный профессионал, 15900, 100)
      , ('Лань', 'Лара', 'Менеджмент', 15000, 60)
      , ('Рамеш', 'Кумар', 'Профессионал', 65000, 630) 

Как вставить несколько записей в таблицу?

В этом примере инструкции вставки сервера Sql мы вставляем несколько записей в таблицу [SQL Insert].Помните: когда вы вставляете несколько записей в таблицу, вы должны указать имена столбцов.

 - Пример инструкции вставки SQL Server
INSERT INTO [dbo]. [SQL Insert] (
[Имя], [Профессия], [Продажи])
ЗНАЧЕНИЯ ('Insert', 'SQL Tutorials', 1225) 

Запрос Above Insert Statement вставляет данные в столбцы [FirstName], [Occupation] и [Sales]. В оставшиеся столбцы вставляются значения NULL.

Sql Insert в операторе Select

Таблица Employ, которую мы используем для запроса Insert Statement

В этом примере инструкции Insert мы выбираем строки из таблицы Employ и вставляем их в целевую таблицу.Здесь мы ограничиваем строки с помощью предложения WHERE.

 - Пример инструкции вставки SQL Server
INSERT INTO [dbo]. [SQL Insert]
ВЫБЕРИТЕ [Имя], [Фамилия], [Род занятий], [Годовой доход], [Продажи]
ИЗ [Учебное пособие по SQL]. [Dbo]. [Employ]
ГДЕ ID> 2 

Над запросом вставьте столбцы [FirstName], [LastName], [Occupation], [YearlyIncome] и [Sales] из исходной таблицы, где значение [ID] больше 2, в таблицу [SQL Insert].

См. Статью INSERT INTO Select Statement.Давайте посмотрим, вставил ли оператор INSERT INTO выбранные данные в целевую таблицу или нет

sql — Вставить в … значения (ВЫБРАТЬ … ИЗ …)

Оба ответа, которые я вижу, отлично работают в Informix и в основном представляют собой стандартный SQL. То есть обозначение:

  INSERT INTO target_table [()] SELECT ... FROM ...;
  

отлично работает с Informix и, как я ожидал, со всеми СУБД. (Когда-то 5 или более лет назад MySQL не всегда поддерживал подобные вещи; теперь он имеет достойную поддержку для такого рода стандартного синтаксиса SQL, и, AFAIK, он будет нормально работать с этой нотацией.Список столбцов является необязательным, но в нем последовательно указываются целевые столбцы, поэтому первый столбец результата SELECT перейдет в первый указанный столбец и т. Д. При отсутствии списка столбцов первый столбец результата SELECT переходит в первый столбец целевой таблицы.

Что может различаться между системами, так это нотация, используемая для идентификации таблиц в разных базах данных — стандарт ничего не говорит об операциях между базами данных (не говоря уже об операциях между СУБД).В Informix вы можете использовать следующую нотацию для обозначения таблицы:

  [dbase [@server]:] [owner.] Таблица
  

То есть вы можете указать базу данных, опционально указав сервер, на котором размещена эта база данных, если он не находится на текущем сервере, за которым следует необязательный владелец, точка и, наконец, фактическое имя таблицы. Стандарт SQL использует термин «схема» для обозначения того, что Informix называет владельцем. Таким образом, в Informix любая из следующих нотаций может идентифицировать таблицу:

  стол
"владелец".Таблица
база данных: таблица
база данных: owner.table
база данных @ сервер: таблица
dbase @ server: owner.table
  

Собственник вообще не нуждается в цитировании; однако, если вы все же используете кавычки, вам нужно, чтобы имя владельца было написано правильно — оно становится чувствительным к регистру. То есть:

  кто-то. Стол
"кто-то" .table
SOMEONE.table
  

идентифицируют одну и ту же таблицу. В случае с Informix возникают небольшие сложности с базами данных MODE ANSI, где имена владельцев обычно переводятся в верхний регистр (за исключением informix).То есть в базе данных MODE ANSI (обычно не используемой) вы можете написать:

  СОЗДАТЬ ТАБЛИЦУ something.table (...)
  

, а имя владельца в системном каталоге будет «КТО-ТО», а не «кто-то». Если вы заключите имя владельца в двойные кавычки, оно действует как идентификатор с разделителями. В стандартном SQL идентификаторы с разделителями можно использовать во многих местах. В Informix вы можете использовать их только вокруг имен владельцев — в других контекстах Informix обрабатывает строки в одинарных и двойных кавычках как строки, а не разделяет строки в одинарных кавычках как строки и строки в двойных кавычках как идентификаторы с разделителями.(Конечно, для полноты картины существует переменная среды DELIMIDENT, которой можно присвоить любое значение, но Y является наиболее безопасным вариантом — чтобы указать, что двойные кавычки всегда окружают идентификаторы с разделителями, а одинарные кавычки всегда окружают строки.)

Обратите внимание, что MS SQL Server может использовать [идентификаторы с разделителями], заключенные в квадратные скобки. Мне это кажется странным и, конечно же, не является частью стандарта SQL.

Insert Into SQL: Add Data (MySQL Tutorial)

(Вставить в SQL: добавить данные)

После того, как вы создали таблицу, вам нужно добавить в нее данные.Если вы используете phpMyAdmin, вы можете ввести эту информацию вручную. Сначала выберите человека , название вашего стола указано слева. Затем с правой стороны выберите вкладку под названием , вставьте и введите данные, как показано. Вы можете просмотреть свою работу, выбрав человека , а затем перейдите на вкладку .

Вставить в SQL — Добавить данные

Анджела Брэдли

Более быстрый способ — добавить данные из окна запроса (выберите значок SQL в phpMyAdmin) или из командной строки, набрав:

 
 ВСТАВИТЬ В людей ЦЕННОСТИ («Джим», 45, 1.75, "2006-02-02 15:35:00"), ("Пегги", 6, 1.12, "2006-03-02 16:21:00") 

Это вставляет данные прямо в таблицу «люди» в указанном порядке. Если вы не уверены, в каком порядке находятся поля в базе данных, вы можете использовать вместо этого эту строку:

 
 ВСТАВИТЬ люди (имя, дата, рост, возраст) ЗНАЧЕНИЯ («Джим», «2006-02-02 15:35:00», 1,27, 45) 

Здесь мы сначала сообщаем базе данных порядок отправки значений, а затем фактические значения.

Команда обновления SQL — обновление данных

Анджела Брэдли

Часто бывает необходимо изменить данные, которые есть в вашей базе данных.Допустим, Пегги (из нашего примера) пришла в гости в свой 7-й день рождения, и мы хотим заменить ее старые данные новыми данными. Если вы используете phpMyAdmin, вы можете сделать это, выбрав свою базу данных слева (в нашем случае человека, ), а затем выбрав «Обзор» справа. Рядом с именем Пегги вы увидите значок карандаша; это означает ИЗМЕНИТЬ. Выберите карандаш . Теперь вы можете обновить ее информацию, как показано.

Вы также можете сделать это через окно запроса или командную строку.Вы должны быть очень осторожны при обновлении записей таким образом и дважды проверять свой синтаксис, так как очень легко случайно перезаписать несколько записей.

 
 ОБНОВИТЬ людей SET age = 7, date = "2006-06-02 16:21:00", height = 1.22 WHERE name = "Peggy" 

Это обновляет таблицу «люди», устанавливая новые значения для возраста, даты и роста. Важной частью этой команды является WHERE , которая гарантирует, что информация обновляется только для Пегги, а не для каждого пользователя в базе данных.

Оператор выбора SQL — поиск данных

Анджела Брэдли

Хотя в нашей тестовой базе данных всего две записи, и все легко найти, по мере роста базы данных полезно иметь возможность быстро искать информацию. В phpMyAdmin вы можете сделать это, выбрав свою базу данных, а затем выбрав вкладку search . Показан пример поиска всех пользователей младше 12 лет.

В нашем примере базы данных это вернуло только один результат — Пегги.

Чтобы выполнить тот же поиск из окна запроса или командной строки, мы должны ввести:

 
 ВЫБРАТЬ * ОТ людей ГДЕ возраст <12 

Это означает ВЫБРАТЬ * (все столбцы) из таблицы «люди», ГДЕ поле «возраст» - это число меньше 12.

Если бы мы хотели видеть только имена людей младше 12 лет, мы могли бы запустить это вместо этого:

 
 ВЫБЕРИТЕ имя ОТ людей ГДЕ возраст <12 

Это может быть более полезным, если ваша база данных содержит много полей, не имеющих отношения к тому, что вы сейчас ищете.

Оператор удаления SQL - удаление данных

Часто вам нужно удалить старую информацию из базы данных. Вы должны быть очень осторожны, , , когда делаете это, потому что как только он исчез, он исчезнет. При этом, когда вы находитесь в phpMyAdmin, вы можете удалить информацию несколькими способами. Сначала выберите базу данных слева. Один из способов удалить записи - выбрать вкладку просмотра справа. Рядом с каждой записью вы увидите красный крестик. При выборе X запись будет удалена. Чтобы удалить несколько записей, вы можете установить флажки в крайнем левом углу, а затем нажать красный крестик внизу страницы.

Еще вы можете выбрать вкладку поиск . Здесь вы можете выполнить поиск. Допустим, у врача в нашей базе данных примера появился новый партнер, который является педиатром. Он больше не будет видеть детей, поэтому всех младше 12 лет нужно удалить из базы данных. Вы можете выполнить поиск людей младше 12 лет на этом экране поиска. Все результаты теперь отображаются в формате просмотра, где вы можете удалить отдельные записи с красным крестиком или проверить несколько записей и выбрать красный X внизу экрана.

Удалить данные с помощью поиска из окна запроса или командной строки очень просто, но, пожалуйста, будьте осторожны :

 
 УДАЛИТЬ ОТ людей ГДЕ возрастом <12 

Если таблица больше не нужна, вы можете удалить всю таблицу, выбрав вкладку Drop в phpMyAdmin или запустив эту строку:

 
 DROP TABLE человек 

INSERT Заявление

Этот оператор SQL можно выполнить следующими способами:

Через

CA Datacom® Datadictionary ™

Interactive SQL Service Facility

(интерактивный)


В прикладной программе, подготовленной с использованием

CA Datacom® / DB

SQL Preprocessor

(встроенный)


При использовании

CA Dataquery

(SQL и пакетные режимы)


YES указывает допустимый метод выполнения для этого оператора.

Оператор INSERT вставляет строки в таблицу или представление. При вставке строки в представление строка вставляется в таблицу, на которой основано представление. Вы должны указать ISOLEVEL = C (уровень изоляции C) в параметрах препроцессора при использовании оператора INSERT.

Когда активна опция NOMAINT функции

CA Datacom® / DB

Utility (DBUTLTY) ACCESS, оператор INSERT получает код возврата

CA Datacom® / DB

94 (87), где 87 - десятичный внутренний код возврата. (шестнадцатеричный 57), который сообщает вам, что никакие операторы обслуживания не разрешены, пока NOMAINT действует.Также обратите внимание, что ограничения, которые существовали в версиях до r10, могут действовать по-разному в версии 10.0 и выше, потому что в версии 10.0 и выше столбцы, содержащие NULL, а не значение

, а не

, вызывают нарушение ограничения CHECK. Ограничения в версии 10.0 и выше считаются выполненными, если только предикаты не вычисляют явным образом значение FALSE. То есть ограничения CHECK, предикаты которых оцениваются как UNKNOWN, а не TRUE или FALSE, рассматриваются в версии 10.0 и выше, чтобы были удовлетворены. Следовательно, операторы INSERT и UPDATE из версий до r10, которые привели к обнулению ограниченных столбцов, при использовании в версии 10.0 и выше оказываются впервые успешными.

На этой странице обсуждаются следующие темы:

Ниже приводится синтаксическая диаграмма оператора INSERT. См. Раздел Специальные регистры для получения диаграммы специальных регистров. См. Синтаксическую диаграмму этой подвыборки в разделе «Подвыбор».

Специальный регистр - это расширение

CA Datacom® / DB

.

►►─ INSERT INTO ─┬─  

table-name

─┬───────────────────────────────── ─────────────► └─

view-name

──┘ │ ┌─, ──────────── │ └─ (─ ▼ ─

имя-столбца

─┴─) ─┘ ┌─, ─────────────────────┐ ►── ЗНАЧЕНИЯ (─ ▼ ─┬─

специальный регистр

─┬─┴─) ─┬──────────────────────── ───────►◄ │ ├─

переменная хоста

────┤ │ │ ├─

литерал

────────── │ │ └─ NULL ────────────── │ └─

подзапрос

───────────────────────────────

  • Укажите имя таблицы или представления, в которое вы хотите вставить строку (строки).Таблица или представление должны быть описаны в

    CA Datacom® Datadictionary ™

    и не должны быть таблицей

    CA Datacom® Datadictionary ™

    или любым из следующих типов представлений:

    • Представление только для чтения.

    • Вид таблицы

      CA Datacom® Datadictionary ™

      .

    • Представление со столбцом, полученным из литерала или арифметического выражения.

    • Представление с двумя столбцами, полученными из одного столбца базовой таблицы.


  • Укажите имя одного или нескольких столбцов, для которых вы вводите значения вставки. Вы можете назвать столбцы в любом порядке. Каждый столбец должен принадлежать указанной вами таблице или представлению, и вы не можете назвать один и тот же столбец более одного раза. Имена столбцов должны быть разделены запятыми, а список должен быть заключен в круглые скобки.
  • ЗНАЧЕНИЯ


    Вводит одну строку значений для вставки. Значения строки - это значения ключевых слов, литералов или переменных хоста, указанных в предложении.Значения должны быть разделены запятыми, а список должен быть заключен в круглые скобки. При выполнении оператора количество значений в предложении VALUES должно равняться количеству имен в списке столбцов. Первое значение вставляется в первый столбец списка, второе значение - во второй столбец и так далее.


    • См. Раздел Специальные регистры для получения диаграммы специальных регистров. Это расширение

      CA Datacom® / DB

      .


    • Укажите переменную хоста, которая должна быть переменной, описанной в вашей программе в соответствии с правилами объявления переменных хоста.

    • Укажите литерал, соответствующий типу данных столбца.
    • ПУСТО


      Используйте ключевое слово NULL, чтобы указать, что вставляемые значения являются значениями NULL.


  • Если вы указываете подзапрос, строки таблицы результатов подзапроса вставляются в таблицу или представление, которое вы указали в операторе INSERT. Результатом может быть одна строка, более одной строки или ни одной строки. Если строки не вставлены, SQLCODE устанавливается на +100.См. Синтаксическую диаграмму этой подвыборки в разделе «Подвыбор».

Таблица или представление, названные после INSERT INTO, не должны называться в предложении FROM подзапроса или в предложении FROM любого подзапроса в подзапросе.

Количество столбцов в таблице результатов должно равняться количеству имен в списке столбцов. Значение первого столбца результата вставляется в первый столбец списка, второе значение - во второй столбец и так далее.

Вставка значений должна удовлетворять следующим правилам:

  • Значения по умолчанию:


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

  • Длина:


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

Если значения вставки не соответствуют ранее заданным правилам или если во время выполнения оператора INSERT возникает какая-либо другая ошибка, строки не вставляются.

Можно вставить строки, не соответствующие определению представления. Эти строки не могут отображаться в представлении, но вставляются в базовую таблицу представления.

Если соответствующие блокировки еще не существуют, одна или несколько монопольных блокировок приобретаются при выполнении успешного оператора INSERT. Пока блокировки не сняты, к вставленной строке может получить доступ только тот блок восстановления, в котором была выполнена вставка.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *