SQL-Ex blog

Мы можем использовать SELECT. INTO в SQL Server для создания новой таблицы из табличного источника данных. SQL Server использует атрибуты выражений в списке SELECT для определения структуры новой таблицы.
До версии SQL Server 2005 использование SELECT. INTO в рабочем коде считалось плохим стилем (code smell), влияющим на производительность, поскольку при этом запрашивались блокировки схемы, накладываемые на системные таблицы. В результате SQL Server оказывался недоступным в течение выполнения этого запроса, поскольку DDL-оператор включается в неявную транзакцию, которая может занимать продолжительное время пока данные вставляются в рамках того же оператора. Однако это поведение пофиксили в SQL Server 2005, когда изменилась модель блокировок.
Оператор SELECT. INTO стал популярным, поскольку это был более быстрый способ вставки данных по сравнению с использованием INSERT INTO . SELECT. Это было обусловлено, главным образом, тем, что операция SELECT. INTO использовала, где это возможно, режим неполного протоколирования (bulk-logged). Хотя INSERT INTO теперь тоже может использовать этот режим, вы все еще можете увидеть лучшую производительность в SQL Server 2012 и 2014, поскольку SELECT. INTO может быть распараллелен в этих версиях, тогда как параллельное выполнение INSERT INTO появилось только в версии SQL Server 2016. Однако при SELECT. INTO вы по-прежнему должны определять все необходимые индексы, ограничения и т.д. на новой таблице.
Как правило, SELECT. INTO остается полезным инструментом для разработки, но теперь он не имеет очевидных преимуществ в производительности, и имеет сомнительное значение для рабочих баз данных. Этот оператор не является частью стандарта SQL. Обычно легче работать с таблицами, созданными оператором CREATE TABLE, поскольку при этом вы получаете преимущество в предварительном задании ограничений и типов данных, что дополнительно уменьшает вероятность несогласованности данных.
Рекомендуется избегать использования SELECT. INTO в рабочем коде.
Создание таблиц с помощью оператора SELECT INTO
Назначением SELECT. INTO в SQL Server было сохранение табличного источника в рамках процесса. Вот простой пример:

При этом табличным источником может быть не только обычная таблица, а также пользовательская функция, OpenQuery, OpenDataSource, предложение OPENXML, производная таблица, соединяемая таблица, пивот-таблица, удаленный источник данных, табличная переменная или переменная функция. С этими более экзотичными табличными источниками синтаксис SELECT. INTO становится более полезным.
Является ли SELECT INTO частью стандарта ANSI?
ANSI стандарт поддерживает конструкцию SELECT. INTO во встроенном SQL; она называется единичным select и загружает то, что возвращает единственная строка, в переменные базового языка.
Люди часто используют SELECT. INTO ошибочно полагая, что это быстрый способ сделать копию таблицы, а потому удивляются, что никакие индексы, ограничения, вычисляемые столбцы или триггеры, определенные для исходной таблицы, не были перенесены в новую. Они не могут быть специфицированы в операторе SELECT. INTO в принципе. Это также относится к допустимости NULL значений или сохранению вычисляемых столбцов. Все эти задачи должны выполняться уже после того, как созданная таблица будет заполнена данными, что неизбежно занимает время.
Хотя вы можете использовать функцию IDENTITY (тип данных, начальное значение, шаг) для установки поля счетчика и, когда источником является одна таблица, получить столбец в результирующей таблицы со свойством identity. Вероятно, этот факт и приводит разработчиков к мысли, что переносятся и другие атрибуты столбцов.
Помимо этого, данный оператор не может создавать секционированные (фрагментированные) таблицы, разреженные столбцы или другие атрибуты, наследуемые из исходной таблицы. Как это могло бы быть сделано, если табличный источник представляет собой запрос с множеством соединений или полученный из экзотических внешних источников данных?
Начиная с SQL 2012 SP1 CU10, SELECT. INTO может выполняться параллельно. Однако, начиная с SQL Server 2016, допускается параллельное выполнение обычного оператора INSERT INTO…SELECT с определенными ограничениями. Поэтому некоторое преимущество в производительности при использовании SELECT. INTO становится весьма призрачным. Процесс INSERT INTO также может быть ускорен, если он может использовать режим неполного протоколирования, а не режим полного восстановления (fully-recovered), вставкой пустой таблицы или таблицы без кластеризованного индекса, и установкой хинта TABLOCK для таблицы.
- Свойство INDENTITY для столбца переносится, но если не:
Оператор SELECT содержит соединенные таблицы (при использовании JOIN или UNION), предложения GROUP BY или агрегатные функции. Если вы хотите избежать переноса свойства IDENTITY в новую таблицу, но хотите сохранить значения в столбце, можно добавить заведомо ложное условие соединения или UNION, который не добавит строк.
Столбец IDENTITY указывается в списке SELECT более одного раза.
Столбец IDENTITY входит в выражение.
Столбец IDENTITY берется из удаленного источника данных.
- Вы не SELECT. INTO в табличнозначный параметр или табличную переменную, хотя можете использовать их в предложении FROM.
- Даже если исходная таблица является секционированной, новая таблица создается в файловой группе по умолчанию. Однако в SQL Server 2017 возможно указать файловую группу, в которой создается новая таблица с помощью предложения ON.
- Вы можете задать предложение ORDER BY, но оно будет игнорироваться. Поэтому порядок IDENTITY_INSERT не гарантируется.
- Когда вычисляемый столбец включается в список SELECT, соответствующий столбец в новой таблице не является вычисляемым столбцом. Значения в новом столбце являются результатом вычисления при выполнении оператора SELECT. INTO.
- Как и в случае CREATE TABLE, если оператор SELECT. INTO содержится в явной транзакции, на соответствующие строки в задействованных системных таблицах накладывается блокировка без взаимного доступа, пока транзакция не завершится. В процессе выполнения транзакции другие процессы, которые используют эти системные таблицы, будут находиться в состоянии ожидания.
Заключение
Подводя итоги, можно сказать, что SELECT. INTO является хорошим способом создания табличного источника, временно сохраняемого как часть процесса, если вам не приходится
беспокоиться об ограничениях, индексах и специальных столбцах. Это не лучший способ копирования таблицы, поскольку только основные элементы схемы могут быть скопированы. За прошедшие годы возникали факторы, которые увеличивали или принижали привлекательность SELECT. INTO, но в целом следует избегать их применения где попало. Лучше создавать таблицу явно со всеми её характеристиками, чтобы гарантировать согласованность данных.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Предложение SELECT . INTO (Transact-SQL)
Инструкция SELECT…INTO создает новую таблицу в файловой группе по умолчанию и вставляет в нее результирующие строки из запроса. Полный синтаксис SELECT см. в разделе SELECT (Transact-SQL).
Синтаксис
[ INTO new_table ] [ ON filegroup ]
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
new_table
Указывает имя новой таблицы, создаваемой на основе столбцов, указанных в списке выбора, и строк, выбираемых из источника данных.
Формат аргумента new_table определяется путем расчета выражений, указанных в списке выбора. Столбцы в таблице, указанной в аргументе new_table, создаются в порядке, соответствующем списку выбора. Все столбцы таблицы, указанной в аргументе new_table, получают такие же имена, значения, типы данных и свойства допустимости значений NULL, которые указаны в соответствующем выражении в списке выбора. Свойство IDENTITY столбца переносится за исключением случаев, когда наступают условия, описанные в подразделе «Примечания» раздела «Работа со столбцами идентификаторов».
Чтобы создать таблицу в другой базе данных в том же экземпляре SQL Server, укажите new_table в качестве полного имени в форме database.schema.table_name.
new_table нельзя создать на удаленном сервере, однако new_table можно заполнить из удаленного источника данных. Для создания таблицы new_table из удаленного источника таблицы определите источник таблицы, используя четырехчастное имя в форме linked_server.catalog.schema.object в предложении FROM инструкции SELECT. Для указания удаленного источника данных также можно использовать функцию OPENQUERY или функцию OPENDATASOURCE в предложении FROM.
filegroup
Указывает имя файловой группы, в которой будет создана таблица. Указанная файловая группа должна существовать в базе данных, в противном случае обработчик SQL Server создает ошибку.
Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и более поздних версий.
Типы данных
Атрибут FILESTREAM не переносится в новую таблицу. Объекты BLOB FILESTREAM копируются и хранятся в новой таблице как объекты BLOB типа varbinary(max). Без атрибута FILESTREAM тип данных varbinary(max) имеет ограничение в 2 ГБ. Если размер большого двоичного объекта FILESTREAM превышает это значение, происходит ошибка 7119 и инструкция прекращает работу.
При выборе существующего столбца идентификаторов в новой таблице новый столбец наследует свойство IDENTITY, если не выполняется ни одно из следующих условий.
- Инструкция SELECT содержит соединение.
- несколько инструкций SELECT соединены при помощи UNION;
- столбец идентификаторов встречается более чем один раз в списке выбора;
- столбец идентификаторов является частью выражения;
- столбец идентификаторов получен из удаленного источника данных.
Если любое из этих условий выполняется, столбец создается как NOT NULL и не наследует свойство IDENTITY. Если в новой таблице необходим столбец идентификаторов, но такой столбец недоступен или необходимо изменить начальное значение или шаг приращения по сравнению с исходным столбцом идентификаторов, определите столбец в списке выбора с помощью функции IDENTITY. См. подраздел «Создание столбца идентификаторов с помощью функции IDENTITY» далее в разделе «Примеры».
Замечания
Инструкция SELECT. INTO работает в два этапа — создается новая таблица, затем вставляются строки. Это означает, что если произойдет сбой операций вставки, все они откатываются, но новая таблица остается (пустая). Если вам нужно гарантировать успех или неуспех всей операции целиком, используйте явную транзакцию.
Хранилище в Microsoft Fabric не поддерживает файловые группы. Ссылки и примеры в этой статье для файловых групп не применяются к хранилищу в Microsoft Fabric.
Ограничения
В качестве новой таблицы нельзя указывать табличную переменную или возвращающий табличное значение параметр.
Инструкцию SELECT. INTO нельзя использовать для создания секционированной таблицы, даже если исходная таблица является секционированной. Инструкция SELECT. INTO не использует схему секционирования исходной таблицы. Вместо этого новая таблица создается в файловой группе по умолчанию. Для вставки строк в секционированную таблицу необходимо сначала создать секционированную таблицу, а затем использовать инструкцию INSERT INTO. SELECT. FROM .
Индексы, ограничения и триггеры, определенные в исходной таблице, не переносятся в новую таблицу, их также нельзя указывать в инструкции SELECT. INTO . Если эти объекты нужны для дальнейшей работы, их можно создать после выполнения инструкции SELECT. INTO .
Указание предложения ORDER BY не гарантирует, что строки будут вставлены в указанном порядке.
Если в список выбора входит разреженный столбец, то свойство разреженного столбца не передается столбцу в новой таблице. Если это свойство необходимо в новой таблице, измените определение столбца после выполнения инструкции SELECT. INTO для включения этого свойства.
Если в список выбора входит вычисляемый столбец, соответствующий столбец новой таблицы не будет вычисляемым. Значениями нового столбца становятся значения, вычисленные при выполнении инструкции SELECT. INTO .
Режим ведения журнала
Объем информации, записываемой в журнал для операции SELECT. INTO , зависит от модели восстановления, действующей для базы данных. В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются. При минимальном ведении журнала использование инструкции SELECT. INTO может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT. Дополнительные сведения см. в статье Журнал транзакций (SQL Server).
Инструкции SELECT. INTO , содержащие определяемые пользователем функции (UDF), являются полностью протоколируемыми операциями. Если определяемые пользователем функции, используемые в инструкции SELECT. INTO , не выполняют никакие операции доступа к данным, для таких функций можно указать предложение SCHEMABINDING, которое будет устанавливать для производного свойства UserDataAccess значение 0. После этого изменения инструкции SELECT. INTO будут протоколироваться на минимальном уровне. Если инструкция SELECT. INTO ссылается хотя бы на одну определяемую пользователем функцию, для которой это свойство имеет значение 1, операция полностью протоколируется.
Разрешения
Требуется разрешение CREATE TABLE в целевой базе данных.
Примеры
А. Создание таблицы путем указания столбцов из нескольких источников
В следующем примере таблица создается dbo.EmployeeAddresses в базе данных AdventureWorks2022, выбрав семь столбцов из различных таблиц, связанных с сотрудниками и адресами.
SELECT c.FirstName, c.LastName, e.JobTitle, a.AddressLine1, a.City, sp.Name AS [State/Province], a.PostalCode INTO dbo.EmployeeAddresses FROM Person.Person AS c JOIN HumanResources.Employee AS e ON e.BusinessEntityID = c.BusinessEntityID JOIN Person.BusinessEntityAddress AS bea ON e.BusinessEntityID = bea.BusinessEntityID JOIN Person.Address AS a ON bea.AddressID = a.AddressID JOIN Person.StateProvince as sp ON sp.StateProvinceID = a.StateProvinceID; GO
B. Вставка строк с применением минимального протоколирования
В следующем примере создается таблица dbo.NewProducts , а затем вставляются строки из таблицы Production.Product . В примере предполагается, что для модели восстановления базы данных AdventureWorks2022 задано значение FULL. Чтобы обеспечить использование минимального ведения журнала, модель восстановления базы данных AdventureWorks2022 имеет значение BULK_LOGGED до вставки строк и сброса до full после выбора. Оператор INTO. Эта процедура обеспечивает минимальное использование журнала транзакций инструкцией SELECT. INTO и ее эффективное выполнение.
ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED; GO SELECT * INTO dbo.NewProducts FROM Production.Product WHERE ListPrice > $25 AND ListPrice < $100; GO ALTER DATABASE AdventureWorks2022 SET RECOVERY FULL; GO
C. Создание столбца идентификаторов с помощью функции IDENTITY
В следующем примере функция IDENTITY используется для создания столбца удостоверений в новой таблице Person.USAddress в базе данных AdventureWorks2022. Это необходимо, поскольку инструкция SELECT, которая определяет таблицу, содержит соединение, и в результате свойство IDENTITY не переносится в новую таблицу. Обратите внимание, что начальное значение и шаг приращения, заданные в функции IDENTITY, отличаются от значений в столбце AddressID исходной таблицы Person.Address .
-- Determine the IDENTITY status of the source column AddressID. SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, is_identity, seed_value, increment_value FROM sys.identity_columns WHERE name = 'AddressID'; -- Create a new table with columns from the existing table Person.Address. -- A new IDENTITY column is created by using the IDENTITY function. SELECT IDENTITY (int, 100, 5) AS AddressID, a.AddressLine1, a.City, b.Name AS State, a.PostalCode INTO Person.USAddress FROM Person.Address AS a INNER JOIN Person.StateProvince AS b ON a.StateProvinceID = b.StateProvinceID WHERE b.CountryRegionCode = N'US'; -- Verify the IDENTITY status of the AddressID columns in both tables. SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, is_identity, seed_value, increment_value FROM sys.identity_columns WHERE name = 'AddressID';
D. Создание таблицы путем указания столбцов из удаленного источника данных
В следующем примере показаны три метода создания новой таблицы на локальном сервере из удаленного источника данных. Пример начинается с создания ссылки на удаленный источник данных. Затем задается имя связанного сервера ( MyLinkServer, ) в предложении FROM первой инструкции SELECT. INTO и в функции OPENQUERY второй инструкции SELECT. INTO. В третьей инструкции SELECT. INTO используется функция OPENDATASOURCE, которая непосредственно задает удаленный источник данных, не указывая имя связанного сервера.
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.
USE master; GO -- Create a link to the remote data source. -- Specify a valid server name for @datasrc as 'server_name' -- or 'server_name\instance_name'. EXEC sp_addlinkedserver @server = N'MyLinkServer', @srvproduct = N' ', @provider = N'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2022'; GO USE AdventureWorks2022; GO -- Specify the remote data source in the FROM clause using a four-part name -- in the form linked_server.catalog.schema.object. SELECT DepartmentID, Name, GroupName, ModifiedDate INTO dbo.Departments FROM MyLinkServer.AdventureWorks2022.HumanResources.Department GO -- Use the OPENQUERY function to access the remote data source. SELECT DepartmentID, Name, GroupName, ModifiedDate INTO dbo.DepartmentsUsingOpenQuery FROM OPENQUERY(MyLinkServer, 'SELECT * FROM AdventureWorks2022.HumanResources.Department'); GO -- Use the OPENDATASOURCE function to specify the remote data source. -- Specify a valid server name for Data Source using the format -- server_name or server_name\instance_name. SELECT DepartmentID, Name, GroupName, ModifiedDate INTO dbo.DepartmentsUsingOpenDataSource FROM OPENDATASOURCE('SQLNCLI', 'Data Source=server_name;Integrated Security=SSPI') .AdventureWorks2022.HumanResources.Department; GO
Д. Импорт из внешней таблицы, созданной с помощью PolyBase
Вы можете импортировать данные из Hadoop или службы хранилища Azure в SQL Server для постоянного хранения. Чтобы импортировать данные, на которые ссылается внешняя таблица, следует использовать SELECT INTO . Оперативно создайте реляционную таблицу, а затем индекс хранилища столбца на основе таблицы, описанной на втором шаге.
Область применения: SQL Server.
-- Import data for car drivers into SQL Server to do more in-depth analysis. SELECT DISTINCT Insured_Customers.FirstName, Insured_Customers.LastName, Insured_Customers.YearlyIncome, Insured_Customers.MaritalStatus INTO Fast_Customers from Insured_Customers INNER JOIN ( SELECT * FROM CarSensor_Data where Speed > 35 ) AS SensorD ON Insured_Customers.CustomerKey = SensorD.CustomerKey ORDER BY YearlyIncome;
F. Копирование данных из одной таблицы в другую и создание новой таблицы в указанной файловой группе
В следующем примере показано создание новой таблицы в качестве копии другой таблицы и ее загрузка в указанную файловую группу, отличную от файловой группы по умолчанию для пользователя.
Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и более поздних версий.
ALTER DATABASE [AdventureWorksDW2022] ADD FILEGROUP FG2; ALTER DATABASE [AdventureWorksDW2022] ADD FILE ( NAME='FG2_Data', FILENAME = '/var/opt/mssql/data/AdventureWorksDW2022_Data1.mdf' ) TO FILEGROUP FG2; GO SELECT * INTO [dbo].[FactResellerSalesXL] ON FG2 FROM [dbo].[FactResellerSales];
SQL INSERT INTO
Команда INSERT добавляет строки в таблицу или представление основной таблицы.
Синтаксис команды Sql INSERT INTO

Основные ключевые слова и параметры команды 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 dept VALUES (50, "ПРОДУКЦИЯ", "САН-ФРАНЦИСКО");
INSERT INTO Customers (city, cname, cnum) VALUES (‘London’, 'Hoffman', 2001);
INSERT INTO. Пример 2
Нижеприведенная команда копирует данные сотрудников фирмы, комиссионные которых превышают 25% от дохода в таблицу bonus:
INSERT INTO bonus SELECT ename, job, sal, comm FROM emp WHERE comm > 0.25 * sal;
INSERT INTO. Пример 3
Если нужно вставить NULL-значение, необходимо указать его как обычное значение следующим образом:
INSERT INTO Salespeople VALUES (1001,’Peel’,NULL,12);
INSERT INTO. Пример 4
Команду INSERT можно применить для того, чтобы извлечь значения из одной таблицы и разместить их в другой, воспользовавшись для этого запросом. Для этого достаточно заменить предложение VALUES на соответствующий запрос:
INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE city = ‘London’;
MySQL INSERT
Для вставки новых строк в базу данных MySQL используется команда INSERT, примеры команды INSERT приведены ниже:
MySQL INSERT INTO. Пример 1
Вставка новой строки в таблицу table_name.
INSERT INTO table_name VALUES ('1', '165', '0', 'name');
MySQL INSERT INTO. Пример 2
Вставка новой строки в таблицу table_name с указанием вставки данных в нужные нам колонки.
INSERT INTO table_name VALUES ('1', '165', '0', 'name');
В базе данных MySQL имеется возможность вставлять множество новых строк, используя одну команду INSERT.
MySQL INSERT INTO Пример 3
Вставка несколько строк в таблицу table_name.
INSERT INTO table_name (tbl_id, chislo, chislotwo, name) VALUES ('1', '159', '34', 'name1'), ('2', '14', '61', 'name2'), ('3', '356', '8', 'name3');
Sql into что это
SELECT INTO — создать таблицу из результатов запроса
Синтаксис
[ WITH [ RECURSIVE ]запрос_WITH[, . ] ] SELECT [ ALL | DISTINCT [ ON (выражение[, . ] ) ] ] * |выражение[ [ AS ]имя_результата] [, . ] INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ]новая_таблица[ FROMэлемент_FROM[, . ] ] [ WHEREусловие] [ GROUP BYвыражение[, . ] ] [ HAVINGусловие] [ WINDOWимя_окнаAS (определение_окна) [, . ] ] [ < UNION | INTERSECT | EXCEPT >[ ALL | DISTINCT ]выборка] [ ORDER BYвыражение[ ASC | DESC | USINGоператор] [ NULLS < FIRST | LAST >] [, . ] ] [ LIMIT <число| ALL > ] [ OFFSETначало[ ROW | ROWS ] ] [ FETCH < FIRST | NEXT >[число] < ROW | ROWS >ONLY ] [ FOR < UPDATE | SHARE >[ OFимя_таблицы[, . ] ] [ NOWAIT ] [. ] ]
Описание
SELECT INTO создаёт новую таблицу и заполняет её данными, полученными из запроса. Данные не передаются клиенту, как с обычной командой SELECT . Столбцы новой таблицы получают имена и типы данных, связанные с выходными столбцами SELECT .
Параметры
TEMPORARY или TEMP
Если указано, создаваемая таблица будет временной. За подробностями обратитесь к CREATE TABLE . UNLOGGED
Если указано, создаваемая таблица будет нежурналируемой. За подробностями обратитесь к CREATE TABLE . новая_таблица
Имя создаваемой таблицы (возможно, дополненное схемой).
Все другие параметры подробно описываются в SELECT .
Замечания
Команда SELECT INTO действует подобно CREATE TABLE AS , но рекомендуется использовать CREATE TABLE AS , так как SELECT INTO не поддерживается в ECPG и PL/pgSQL , вследствие того, что они воспринимают предложение INTO по-своему. К тому же, CREATE TABLE AS предоставляет больший набор возможностей, чем SELECT INTO .
Чтобы добавить столбец OID в таблицу, создаваемую командой SELECT INTO , необходимо установить конфигурационную переменную default_with_oids. С другой стороны, можно использовать CREATE TABLE AS с предложением WITH OIDS .
Примеры
Создание таблицы films_recent , содержащей только последние записи из таблицы films :
SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';
Совместимость
В стандарте SQL команда SELECT INTO применяется для передачи скалярных значений клиентской программе, но не для создания новой таблицы. Именно это применение имеет место в ECPG (см. Главу 34) и в PL/pgSQL (см. Главу 41). В PostgreSQL команда SELECT INTO связана с созданием таблицы по историческим причинам. В новом коде для этих целей лучше использовать CREATE TABLE AS .
См. также
| Пред. | Наверх | След. |
| SELECT | Начало | SET |