Insert (граф sql)insert (sql graph)

Вставка значений в таблицу с указанием или без указания столбцов

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

Будем работать с базой данных портала объявлений. В ней есть таблица ADS, содержащая
данные о объявлениях, поданных за неделю.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД
не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке
.

А скрипт для создания базы данных «Портал объявлений 1», её таблицы и заполения таблицы данных —
в файле по этой ссылке
.

Для использующих же MySQL приводим содержание оператора CREATE для создания таблицы:

CREATE TABLE ADS (
Id INT(11) NOT NULL DEFAULT ‘100’,
Category varchar(25) DEFAULT ‘Some Category’,
Part varchar(25) DEFAULT ‘Some Part’,
Units INT(5) DEFAULT NULL,
Money INT(10) DEFAULT NULL,
PRIMARY KEY (Id)
)

Пример 1. Итак, есть база данных портала объявлений.
Таблица ADS выглядит так:

Id Category Part Units Money
1 Транспорт Автомашины 110 17600
2 Недвижимость Квартиры 89 18690
3 Недвижимость Дачи 57 11970
4 Транспорт Мотоциклы 131 20960
5 Стройматериалы Доски 68 7140
6 Электротехника Телевизоры 127 8255
7 Электротехника Холодильники 137 8905
8 Стройматериалы Регипс 112 11760
9 Досуг Книги 96 6240
10 Недвижимость Дома 47 9870
11 Досуг Музыка 117 7605
12 Досуг Игры 41 2665

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

INSERT INTO ADS
(Id, Category, Part, Units, Money)
VALUES
(13, ‘Недвижимость’, ‘Гаражи’, 22, 4620)

Или без указания имён столбцов:

INSERT INTO ADS
VALUES (13, ‘Недвижимость’, ‘Гаражи’, 22, 4620)

MS SQL Server в ответ на такой запрос выдаст сообщение об ошибке, так как при
создании таблицы было указано, что значения столбца Id являются идентификаторами и вставляются при
добавлении новых строк автоматически с приращением 1. Поэтому на
MS SQL Server нужно использовать следующий запрос (можете скопировать его и вставить в окно запросов):

USE adportal1;

INSERT INTO ADS
(Category, Part, Units, Money)
VALUES
(‘Недвижимость’, ‘Гаражи’, 22, 4620);

В результате выполнения запроса в таблице появится новая строка:

13 Недвижимость Гаражи 22 4620

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

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

Пример 2. Таким будет запрос на MySQL, в котором порядок следования
столбцов изменён:

INSERT INTO ADS
(Category, Id, Money, Part, Units)
VALUES
(‘Недвижимость’, 13, 4620, ‘Гаражи’, 22)

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

Если вы используете MS SQL Server, то в запросе не нужно указывать столбец Id и
запрос с изменённым порядком следования столбцов будет таким:

USE adportal1;

INSERT INTO ADS
(Category, Money, Part, Units)
VALUES
(‘Недвижимость’, 4620, ‘Гаражи’, 22)

Access insert into пример

При помощи этой инструкции, лежащей в основе запросов на добавление (Append Query), можно добавить одну или множество записей в указанную таблицу. Эта инструкция по функциональности является разновидностью описанной выше инструкции SELECT . INTO. Отличие состоит в том, что информация добавляется в уже существующую таблицу, затирая хранящиеся там данные, но не нарушая при этом ее структуру. Синтаксис для добавления группы записей в таблицу следующий:

INSERT INTO назначение ])] SELECT поле_1 FROM выражение

Вариант синтаксиса для добавления одной записи:

INSERT INTO назначение ])] VALUES (значение_1)

Описание используемых параметров: назначение. Имя таблицы, в которую добавляются записи. поле_1, поле_2, . . Имена полей, в которые добавляются данные (если они следуют за аргументом назначение) или из которых выбираются данные (если они следуют за аргументом источник). ВнешняяБазаДанных. В конструкции IN можно указать полный путь и имя файла внешней базы данных. Вы можете выбрать информацию из таблиц внешней базы данных (предложение FROM) и вставить итоговую выборку в таблицу внешней базы данных (предложение INSERT INTO). если вы хотите вставить одну запись, можно воспользоваться синтаксисом, содержащим предложение VALUES. Вслед за этим предложением (в круглых скобках) следуют значения, присваиваемые полям, перечисленным после параметра назначение. Значения присваиваются в порядке следования полей. То есть первому полю соответствует первое значение, и т.д. Количество и порядок следования значений в предложении VALUES должны в точности соответствовать количеству и порядку следования полей, перечисленных после параметра назначение.

Примеры

Приведенный в этом примере SQL-оператор иллюстрирует синтаксис для добавления в таблицу одной записи. Этот синтаксис используется практически во всех СУБД, поддерживающих SQL. В данном примере в таблицу Доставка добавляется одна запись, состоящая из двух полей: Название и Телефон. Значения для этих полей перечислены через запятую в конструкции VALUES. Таким образом, после выполнения запроса в таблицу Доставка будет добавлена новая запись, содержащая в поле Название значение Аэрофлот, а в поле Телефон — значение (095) 211-9988. Кроме того, поле КодДоставки автоматически получит очередное значение счетчика, поскольку имеет тип Счетчик (AutoNumber).

Если ввести текст рассматриваемого оператора в запрос, открытый в режиме SQL, a затем переключиться в режим конструктора (Design View), то Microsoft Access автоматически распознает тип запроса и изменит строку оператора в соответствии с принятым для стандартных запросов на добавление (Append Query) стилем:

INSERT INTO Доставка ( Название, Телефон ) SELECT «Аэрофлот » AS Выражение1, «(095) 211-9988» AS Выражение2;

SQL-оператор, приведенный в этом примере, отбирает информацию из внешнего файла базы данных и добавляет полученную выборку в таблицу открытой (текущей) базы данных. В приведенном примере выбирается информация из таблиц Заказы и Заказано, которые расположены во внешнем файле базы данных DataBase1.mdb (в папке C:Moи Документы). Эти таблицы связаны между собой по полям КодЗаказа (связь задана в конструкции WHERE). Итоговая выборка после группировки, вычисления значений поля Стоимость заказа и сортировки по убыванию по этому же полю, добавляется в таблицу Временная. Таблица Временная должна существовать в целевой базе данных к моменту выполнения запроса. Кроме того, к моменту выполнения запроса в таблице Временная должны существовать поля с именами КодКлиента и Стоимость заказа (именно эти имена полей перечислены в конструкции INTO после имени целевой таблицы). Естественно, эти поля должны соответствовать по типу добавляемым данным. Если хотя бы одно из перечисленных условий не выполняется, записи в таблицу добавлены не будут.

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

SQL INSERT

Команда INSERT добавляет строки в таблицу или представление основной таблицы.

Синтаксис команды Sql INSERT

Синтаксис команды Insert

Основные ключевые слова и параметры команды INSERT

  • schema — идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
  • table view — имя таблицы, в которую строки должны быть вставлены; если указано представление, то строки вставляются в основную таблицу представления
  • subquery_1 — подзапрос, который сервер обрабатывает тем же самым способом как представление
  • column — столбец таблицы или представления, в который для каждой вставленной строки вводится значение из фразы VALUES или подзапроса; если один из столбцов таблицы опускается из этого списка, значением столбца для вставленной строки является значение по умолчанию столбца, определенное при создании таблицы. Если полностью опускается список столбца, предложение VALUES или запрос должен определить значения для всех столбцов в таблице
  • VALUES — определяет строку значений, которые будут вставлены в таблицу или представление; значение должно быть определено в предложении VALUES для каждого столбца в списке столбцов
  • subquery_2 — подзапрос, который возвращает строки, вставляемые в таблицу; выборочный список этого подзапроса должен иметь такое же количество столбцов, как в списке столбцов утверждения INSERT

Утверждение INSERT с фразой VALUES добавляет одиночную строку к таблице. Эта строка содержит значения, определенные фразой VALUES.
Утверждение INSERT с подзапросом вместо фразы VALUES добавляет к таблице все строки, возвращенные подзапросом. Сервер обрабатывает подзапрос и вставляет каждую возвращенную строку в таблицу. Если подзапрос не выбирает никакие строки, сервер не вставляет никакие строки в таблицу.Подзапрос может обратиться к любой таблице или представлению, включая целевую таблицу утверждения INSERT. Сервер назначает значения полям в новых строках, основанных на внутренней позиции столбцов в таблице и порядке значений фразы VALUES или в списке выбора запроса. Если какие-либо столбцы пропущены в списке столбцов, сервер назначает им значения по умолчанию, определенные при создании таблицы. Если любой из этих столбцов имеет NOT NULL ограничение то сервер возвращает ошибку, указывающую, что ограничение было нарушено и отменяет утверждение INSERT.
При выдаче утверждения INSERT включается любой INSERT — триггер, определенный на таблице.

INSERT INTO

INSERT INTO Пример 1

INSERT INTO Пример 2
Нижеприведенная команда копирует данные сотрудников фирмы, комисионные которых превышают 25% от дохода в таблицу bonus:

INSERT INTO Пример 3
Если нужно вставить NULL-значение, необходимо указать его как обычное значение следующим образом:

INSERT INTO Пример 4
Команду INSERT можно применить для того, чтобы извлечь значения из одной таблицы и разместить их в другой, воспользовавшись для этого запросом. Для этого достаточно заменить предложение VALUES на соответствующий запрос:

Использование таблиц inserted и deleted в триггерах INSTEAD OFUsing the inserted and deleted Tables in INSTEAD OF Triggers

Таблицы inserted и deleted в триггерах INSTEAD OF подчиняются тем же правилам, что и таблицы inserted и deleted в триггерах AFTER.The inserted and deleted tables passed to INSTEAD OF triggers defined on tables follow the same rules as the inserted and deleted tables passed to AFTER triggers. Формат таблиц inserted и deleted совпадает с форматом таблицы, для которой задан триггер INSTEAD OF.The format of the inserted and deleted tables is the same as the format of the table on which the INSTEAD OF trigger is defined. Каждый столбец таблиц inserted и deleted прямо сопоставляется с определенным столбцом базовой таблицы.Each column in the inserted and deleted tables maps directly to a column in the base table.

Следующие правила относятся к инструкциям INSERT или UPDATE, ссылающимся на таблицу с триггером INSTEAD OF, которые должны предоставлять такие значения для столбцов, как если бы в таблице не было триггера INSTEAD OF.The following rules regarding when an INSERT or UPDATE statement referencing a table with an INSTEAD OF trigger must supply values for columns are the same as if the table did not have an INSTEAD OF trigger:

  • Не могут быть заданы значения для вычисляемых столбцов и для столбцов с типом данных timestamp .Values cannot be specified for computed columns or columns with a timestamp data type.

  • Если параметр IDENTITY_INSERT для этой таблицы не равен ON, то значения для столбцов со свойством IDENTITY не могут быть заданы.Values cannot be specified for columns with an IDENTITY property, unless IDENTITY_INSERT is ON for that table. Когда значение параметра IDENTITY_INSERT равно ON, инструкции INSERT должны сами задавать это значение.When IDENTITY_INSERT is ON, INSERT statements must supply a value.

  • Инструкции INSERT должны определять значения для всех столбцов со свойством NOT NULL, не имеющих ограничений DEFAULT.INSERT statements must supply values for all NOT NULL columns that do not have DEFAULT constraints.

  • Для любого столбца, кроме вычисляемых столбцов, столбцов определителя и столбцов типа timestamp , определение значений является необязательным, если разрешены NULL значения или если какой-либо столбец со свойством NOT NULL обладает определением DEFAULT.For any columns except computed, identity, or timestamp columns, values are optional for any column that allows nulls, or any NOT NULL column that has a DEFAULT definition.

Если инструкция INSERT, UPDATE или DELETE ссылается на представление, для которого определен триггер INSTEAD OF, компонент Компонент Database EngineDatabase Engine вызывает триггер вместо того, чтобы предпринять какое-либо прямое действие по отношению к таблице.When an INSERT, UPDATE, or DELETE statement references a view that has an INSTEAD OF trigger, the Компонент Database EngineDatabase Engine calls the trigger instead of taking any direct action against any table. Триггер использует сведения, представленные в таблицах inserted и deleted, для создания инструкций, необходимых для выполнения требуемых действий в базовых таблицах, даже в том случае, если формат данных в таблицах inserted и deleted, созданных для представления, отличается от формата данных базовой таблицы.The trigger must use the information presented in the inserted and deleted tables to build any statements required to implement the requested action in the base tables, even when the format of the information in the inserted and deleted tables built for the view is different from the format of the data in the base tables.

Формат таблиц inserted и deleted триггера INSTEAD OF, заданного для представления, совпадает со списком выборки инструкции SELECT, заданной для представления.The format of the inserted and deleted tables passed to an INSTEAD OF trigger defined on a view matches the select list of the SELECT statement defined for the view. Пример:For example:

Результирующий набор для этого представления содержит три столбца: один int и два nvarchar .The result set for this view has three columns: an int column and two nvarchar columns. Таблицы inserted и deleted триггера INSTEAD OF, заданного для представления, также содержат столбец типа int с именем , столбец типа nvarchar с именем и столбец типа nvarchar с именем .The inserted and deleted tables passed to an INSTEAD OF trigger defined on the view also have an int column named , an nvarchar column named , and an nvarchar column named .

Защитник Windows (Microsoft Security Essentials)

Многие пользователи Windows 7 привыкли пользоваться Microsoft Security Essential от компании Microsoft. Когда они установили Windows 10, то, конечно задались вопросом – “а где же скачать Microsoft Security Essential для Windows 10”? Правильный ответ – нигде. Дело в том, что начиная с Windows 8 данный антивирусный продукт переименовали в “Защитник Windows” и несколько расширили его функциональность. Поэтому если у Вас Windows 10, то не стоит беспокоиться – “Защитник Windows” изначально включен и работает, спасая вас от угроз в сети. Чем же хорош “Защитник Windows”?

  • Официальный антивирус от компании Microsoft
  • Максимальная простота и скорость работы
  • Защита от шпионского ПО, вирусов, руткитов и других нежелательных программ
  • Оперативная проверка системы и ее лечение

Если у вас нет желания скачивать и устанавливать стороннее программное обеспечение, то вы можете остановиться на “Защитнике Windows”. Тем более он уже работает в вашей Windows 10.

7 ответов

вы не можете сделать:

но вы можете сделать

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

Примечание: я также должен включить некоторую форму фиктивной таблицы (например, onerow), чтобы обмануть доступ к разрешению объединения (в нем должна быть хотя бы одна строка), и вам нужна » верхняя 1 » чтобы убедиться, что вы не получите повторы для таблицы с более чем одной строкой

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

лично я бы создал подпрограмму VBA для этого и подключился к базе данных, используя некоторую форму sql-соединения.

С моей головы Код для этого должен выглядеть примерно так:

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

Если хранилище данных является базой данных Jet, нет смысла использовать любую форму ADO, если вы не используете свой код с платформы сценариев, где это предпочтительный выбор. Если вы находитесь в Access, это определенно не так, и DAO является предпочтительным интерфейсом.

No — запрос в Access-это один оператор SQL. Невозможно создать пакет из нескольких операторов в одном объекте запроса. Вы можете создать несколько объектов запроса и запустить их из макроса/модуля.

@Rik Garner: не уверен, что вы подразумеваете под «партией», но

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

предполагая, что таблица пуста, выше INSERT INTO..SELECT.. должно работать: тот факт, что это не так, потому что ограничение было проверено после вставки первой строки вместо того, чтобы после того, как все три были вставлены (нарушение ANSI SQL-92, но это MS Access для вас ); тот факт, что таблица остается пустой, показывает, что внутренняя транзакция была откатана.

@David W. Fenton: у вас может быть сильное личное предпочтение DAO, но, пожалуйста, не будьте слишком жесткими к кому-то для выбора альтернативной технологии доступа к данным (в этом случае ADO), особенно для ванили INSERT и когда они квалифицируют свои комментарии: «с моей головы, для этого код должен выглядеть примерно так. » в конце концов, вы не можете использовать DAO для создания CHECK ограничения

MS Access не позволяет несколько вставок из одного окна sql. Если вы хотите вставить, сказал 10 строк в таблице, сказал movie (mid, mname, mdirector. ), вам необходимо откройте окна sql,

  1. тип 1-й инструкции, выполнить 1-й инструкции, удалить 1-е полу
  2. введите 2-й stmt, выполните 2-й stmt, удалите 2-й stmt
  3. Тип 3-й инструкции, выполнить 3-й инструкции, удалить 3-й инструкции .

очень скучно. Вместо этого вы можете импортировать строки из excel, выполнив:

  1. щелкните правой кнопкой мыши имя таблицы, которую вы уже создали
  2. импорт из Excel (открывается диалоговое окно импорт)
  3. перейдите к файлу excel, содержащему записи, которые будут импортированы в таблице
  4. нажмите » Добавить копию записей в таблицу:»
  5. выберите требуемую таблицу (в данном примере фильм)
  6. нажмите «OK»
  7. выберите рабочий лист, содержащий данные в электронной таблице
  8. Нажмите кнопку Готово

весь набор данных в excel был загружен в таблицу «MOVIE»

MS Access также может добавлять данные в таблицу из простого текстового файла. CSV значения (я просто использовал поле заменить все, чтобы удалить все, кроме запятых) и в разделе внешние данные выберите текстовый файл.

Insert one row into a table

To insert one row into a table, you use the following syntax of the statement.

There are some points that you should pay attention to when you insert a new row into a table:

  • First, the number of values must be the same as the number of columns. In addition, the columns and values must be the correspondent because the database system will match them by their relative positions in the lists.
  • Second, before adding a new row, the database system checks for all integrity constraints e.g., foreign key constraint, primary key constraint, check constraint and not null constraint. If one of these constraints is violated, the database system will issue an error and terminate the statement without inserting any new row into the table.

It is not necessary to specify the columns if the sequence of values matches the order of the columns in the table. See the following statement that omits the column list in the clause.

However, this is not considering as a good practice.

If you don’t specify a column and its value in the statement when you insert a new row, that column will take a default value specified in the table structure. The default value could be 0, a next integer value in a sequence, the current time, a NULL value, etc. See the following statement:

In this syntax, the will take a default value.

Insert one row into a table example

We will use the and tables in the sample database to show you how to insert one row into the table.

To insert a new row into the table.

We did not use the column in the statement because the column is an auto-increment column, therefore, the database system uses the next integer number as the default value when you insert a new row.

The column is a foreign key that links the table to the   table. Before adding the new rows, the database system checks if the value 178 exists in the column of the   table to make sure that the foreign key constraint is not violated.

If the row is inserted successfully, the database system returned the number of the affected rows.

You can check whether the row has been inserted successfully or not by using the following SELECT statement.

Пример — использование оператора INSERT для вставки нескольких записей

Поместив оператор SELECT в оператор INSERT, вы можете быстро выполнить несколько операций вставки. Давайте рассмотрим пример того, как это сделать.

В этом примере у нас есть таблица employees со следующими данными:

employee_number first_name last_name salary dept_id
1001 Justin Bieber 62000 500
1002 Selena Gomez 57500 500
1003 Mila Kunis 71000 501
1004 Tom Cruise 42000 501

И таблица customers со следующими данными:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

Теперь давайте вставим некоторую информацию из таблицы employees в таблицу customers:

PgSQL

INSERT INTO customers
(customer_id, last_name, first_name)
SELECT employee_number AS customer_id,
last_name,
first_name
FROM employees
WHERE employee_number < 1003;

1
2
3
4
5
6
7

INSERTINTOcustomers

(customer_id,last_name,first_name)

SELECTemployee_numberAScustomer_id,

last_name,

first_name

FROMemployees

WHEREemployee_number<1003;

СОВЕТ: С этим типом INSERT некоторые базы данных требуют от вас псевдонимов имен столбцов в SELECT, чтобы они соответствовали именам столбцов таблицы, в которую вы вставляете. Как вы можете видеть в приведенном выше примере, мы связали первый столбец в операторе SELECT с customer_id.

Будет вставлено 2 записи. Выберите данные из таблицы customers еще раз:

PgSQL

SELECT *
FROM customers;

1
2

SELECT*

FROMcustomers;

Вот результаты, которые вы должны получить:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com
1001 Justin Bieber 62000 NULL
1002 Selena Gomez 57500 NULL

В этом примере последние 2 записи в таблице customers были вставлены с использованием данных из таблицы employees.

INSERT INTO SELECT

The command copies data
from one table and inserts it into another table.

The following SQL copies «Suppliers» into «Customers» (the columns
that are not filled with data, will contain NULL):

Example

INSERT INTO Customers (CustomerName,
City, Country)
SELECT SupplierName, City, Country FROM Suppliers;

The following SQL copies «Suppliers» into «Customers» (fill all
columns):

Example

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode,
Country)SELECT SupplierName, ContactName, Address, City, PostalCode,
Country FROM Suppliers;

The following SQL copies only the German suppliers into «Customers»:

Example

INSERT INTO Customers (CustomerName,
City, Country)
SELECT SupplierName, City, Country FROM SuppliersWHERE Country=’Germany’;

Суть приёма ИНСЕРТ

Приём был разработан американскими учёными Д. Воган и Т. Эстес, а впоследствии дополнен одними из основоположников технологии критического мышления Ч. Темпл, К. Меридит и Д. Стилл. По их определению, ИНСЕРТ — это умение критически осмысливать новую информацию и находить связи с уже изученной посредством работы с текстом. В практическом отношении технология эффективного чтения представляет собой систему знаков, организованных в таблицу, заполнение которой идёт в процессе изучения нового материала. Название приёма складывается из первых букв каждого слова определения:

  • I — interactive (интерактивная)
  • N — noting (познавательная)
  • S — system for (система)
  • E — effective (для эффективного)
  • R — reading and (чтения и)
  • T — thinking (размышления).

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

  • V — «Эта информация мне уже известна»;
  • + — «Новые факты для меня»;
  • — — «У меня было другое представление об этом», «Я думал по-другому»;
  • ? — «В этом материале есть что-то непонятное для меня», «Нужны объяснения, уточнения».

После маркировки учащиеся переносят записи из учебника в специальную таблицу:

V

+

?

Тезисные записи фактов, терминов и понятий, которые уже знакомы

Всё новое, что стало известно из прочитанного

Противоречия, которые появились после прочтения

Непонятные слова, факты, требующие разъяснения

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

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

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

Adblock
detector