Добавление столбцов в таблицу (ядро СУБД)
В этой статье описывается, как добавить новые столбцы в таблицу в SQL Server с помощью SQL Server Management Studio или Transact-SQL.
Замечания
ALTER TABLE С помощью инструкции для добавления столбцов в таблицу эти столбцы автоматически добавляются в конец таблицы.
Если вы хотите, чтобы столбцы в определенном порядке в таблице, необходимо использовать SQL Server Management Studio. Переупорядочивание таблиц не рекомендуется, но дополнительные сведения доступны в статье Изменение порядка столбцов в таблице.
Чтобы запросить существующие столбцы, используйте представление каталога объектов sys.columns.
Разрешения
Требуется разрешение ALTER на таблицу.
Использование SQL Server Management Studio
SQL Server Management Studio (SSMS) не поддерживает все параметры языка определения данных (DDL) в Azure Synapse. Вместо этого используйте скрипты T-SQL.
Вставка столбцов в таблицу с помощью конструктора таблиц
- В обозревателе объектовщелкните правой кнопкой мыши таблицу, в которую необходимо добавить столбцы, и выберите пункт Конструктор.
- Щелкните первую пустую ячейку в столбце Имя столбца.
- Введите имя столбца в ячейку. Имя столбца — значение, которое необходимо указать.
- Нажмите клавишу TAB, чтобы перейти к ячейке типа данных и выбрать тип данных из раскрывающегося списка. Тип данных является обязательным значением и присваивается значение по умолчанию, если вы не выбрали его.
Примечание. Значения по умолчанию можно установить или изменить в диалоговом окне Параметры в разделе Инструменты для баз данных.
Примечание. При создании нового столбца для свойств столбца устанавливаются значения по умолчанию, но их можно изменить на вкладке Свойства столбца .
Использование Transact-SQL
Добавление столбцов в таблицу
В следующем примере добавляются два столбца в таблицу dbo.doc_exa .
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL, column_c INT NULL ;
Связанный контент
- Инструкция ALTER TABLE (Transact-SQL)
- Свойства столбцов (страница «Общие»)
- Создание проверочных ограничений
- Указание значений по умолчанию для столбцов
- Указание вычисляемых столбцов в таблице
- Создание ограничений уникальности
- Индексы
Добавить в существующую таблицу новый столбец и заполнить данными
Здравствуйте. Подскажите, как к существующей таблице с введенными данными добавить новый столбец и заполнить его информацией?
1 2 3 4 5 6 7 8 9 10 11 12
CREATE TABLE [dbo].[Сотрудники]( [СотрудникID] [int] IDENTITY(1,1) NOT NULL, [ФИО] [varchar](30) NOT NULL, [Должность] [varchar](20) NOT NULL, [Телефон] [dbo].[phone] NULL, CONSTRAINT [PK_Менеджеры] PRIMARY KEY CLUSTERED ( [СотрудникID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
Следует добавить обязательный столбец «ДатаПриемки» и заполнить ее датами.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как добавить результаты запроса в существующую таблицу
Как мне добавить результаты запроса в таблицу zakaz в столбец sena_zakaz ? SELECT.
Заполнить NULL столбец данными
Есть таблица из ~100 записей,в которой есть столбец(дата рождения), где все значения=NULL. Как.
Как заполнить новую таблицу данными.
Как заполнить новую таблицу данными, которые есть запрос к другой таблице средствами SQL? Т.е.
Как запросом заполнить таблицу данными из других таблиц?
Доброго времени суток. Попал билет по базам данным. В нем задание 3 таблицы и суть задание.
Регистрация: 24.01.2017
Сообщений: 228
Добавить столбец с помощью ALTER TABLE как nullable;
заполнить данными как нужно;
изменить столбец с помощью ALTER TABLE на NOT NULL
Регистрация: 09.07.2018
Сообщений: 7
Так вот как заполнить с помощью кода, а не графического интерфейса?
Таким образом у меня ошибку выдает:
1 2 3 4
insert into Сотрудники (ДатаПриемки) values ('2018-12-12'), ('2018-12-12'), ('2018-12-12') GO
Регистрация: 24.01.2017
Сообщений: 228
У вас таблица уже создана, а значит надо делать UPDATE а не INSERT.
1 2 3
UPDATE [dbo].[Сотрудники] SET [ДатаПриемки] = '2018-12-12' WHERE [ДатаПриемки] IS NULL
названия колонок и таблиц надо писать in english
Регистрация: 09.07.2018
Сообщений: 7
Добавлено через 9 минут
А чтобы вставить разные значения, а не одну и ту же дату, как можно написать?
А то просто получается, что все значения NULL заполняются одной и той же датой.
P.S. Это просто пример я плохой привел с одинаковыми датами.
4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205
Сообщение от Nekto992 
вставить разные значения, а не одну и ту же дату
Так кто же знает, какие даты тебе нужны?
Регистрация: 09.07.2018
Сообщений: 7
Да любые, просто разобраться хочу
Если писать так,
1 2 3
UPDATE [dbo].[Сотрудники] SET [ДатаПриемки] = '2018-12-12' WHERE [ДатаПриемки] IS NULL
то одна и та же дата заполнит все строки.
А как правильно так чтобы у каждой строки было свое индивидуальное значение.
например:
в 1-й — ‘2018-12-12’
во 2-й — ‘2017-01-05’
в 3-й — ‘2016-03-07’
и т.д.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как в процедуре создать таблицу и заполнить ее данными из других таблиц, по определенному условию
Подскажите пожалуйста, я новичок в SQL, и не совсем понимаю, как можно создать такую процедуру, в.

Как создать таблицу в SQL не прописывая каждый раз новый столбец в SELECT?
Как создать таблицу в SQL не прописывая каждый раз новый столбец в SELECT? Таблица вот такого.
Добавить столбец в существующую таблицу
Возникла необходимость в рабочей базе добавить столбец "Описание" в таблицу "Клиенты". Надо.
Нужно добавить новый правый столбец в таблицу и присвоить ему заголовок
Пожалуйста, киньте фрагмент кода VBA Excel нужно добавить новый правый столбец в таблицу и.
SQL-Ex blog

Заполнение столбца SQL Server последовательным номерами без использования identity
Добавил Sergey Moiseenko on Суббота, 3 сентября. 2022
Проблема
Есть таблица базы данных, которая уже содержит много данных. Необходимо добавить в эту таблицу новый столбец, который имел бы последовательную нумерацию. Помимо добавления столбца, также необходимо заполнить существующие записи инкрементным счетчиком. Какие для этого имеются варианты?
Решение
Первое решение, которое приходит на ум, это добавить столбец identity в таблицу, если она еще не имеет такого столбца. Посмотрим на этот подход, а также на то, как сделать это с помощью простого оператора UPDATE.
Использование столбца identity для инкрементирования значения на 1
Для этого примера мы создадим таблицу (для имитации реально существующей таблицы), загрузим туда 100000 записей, а затем изменим структуру таблицы, добавив столбец identity с приращением 1.
CREATE TABLE accounts ( fname VARCHAR(20), lname VARCHAR(20))
GO
INSERT accounts VALUES ('Fred', 'Flintstone')
GO 100000
SELECT TOP 10 * FROM accounts
GO
ALTER TABLE accounts ADD id INT IDENTITY(1,1)
GO
SELECT TOP 10 * FROM accounts
GO
Статистика по времени и вводу/выводу показывает, что было выполнено 23К логических чтений, и все выполнение заняло 48 секунд.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 17 ms.
Table ‘accounts’. Scan count 1, logical reads 23751, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 6281 ms, elapsed time = 48701 ms.
SQL Server Execution Times:
CPU time = 6281 ms, elapsed time = 48474 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
Использование переменных для обновления и инкрементирования значения на 1
В этом примере мы создаем подобную таблицу, загружаем в неё 100000 записей, после чего изменяем таблицу, добавляя столбец INT и выполняя обновление.
CREATE TABLE accounts2 ( fname VARCHAR(20), lname VARCHAR(20))
GO
INSERT accounts2 VALUES ('Barney', 'Rubble')
GO 100000
SELECT TOP 10 * FROM accounts2
GO
После создания таблицы и загрузки данных мы добавляем в таблицу столбец INT, который не является столбцом identity.
ALTER TABLE accounts2 ADD id INT
GO
SELECT TOP 10 * FROM accounts2
GO
На этом шаге мы собираемся обновить таблицу и для каждой обновляемой строки мы изменяем переменную на 1, а также обновляем столбец id в таблице. Это видно здесь (SET @id = + 1), где мы делаем значение @id и столбец id равными текущему значению @id плюс 1.
DECLARE @id INT
SET @id = 0
UPDATE accounts2
SET @id = + 1
GO
SELECT * FROM accounts2
GO
Ниже можно увидеть результаты, где каждая запись получает приращение 1.
Статистика по времени и вводу/выводу показывает около 26К логических чтений и 4,8 секунды на выполнение.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 247 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
Table ‘accounts2’. Scan count 1, logical reads 26384, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 4781 ms, elapsed time = 4856 ms.
(100000 row(s) affected)
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 1 ms.
Если сравнить статистику по времени и вводу/выводу для обновления со столбцом identity, то данный подход имеет примерно то же самое число логических чтений, но полное время выполнения в 10 раз быстрей для варианта обновления по сравнению с поддержкой значений identity.
Использование переменных для обновления с значением приращения 10
Пусть теперь нам нужен инкремент 10, а не 1. Мы можем выполнить обновление, как мы делали это выше, но использовать значение 10 для приращения id каждой записи.
Для чистоты эксперимента я сначала сделаю значением столбца id NULL для всех записей, а затем выполню обновление.
UPDATE accounts2 SET /> GO
DECLARE @id INT
SET @id = 0
UPDATE accounts2
SET @id = + 10
GO
SELECT * FROM accounts2
GO
Ниже видно, что значения id теперь инкрементируются на 10, а не на 1. Вы можете использовать в качестве инкремента любое желаемое значение.
Предупреждение: возможно появление дубликатов
Читатели блога заметили, что они столкнулись с проблемой появления дублирующих значений, если процесс выполняется параллельно. Эта проблема была замечена на таблице, которая содержала более 11 миллионов строк. Ими были предложены следующие подходы.
-- использование MAXDOP = 1 - автор Steve Ash
-- обновление выполняется при использовании только одного процессора,
-- чтобы избежать проблемы с дубликатами
DECLARE @id INT
SET @id = 0
UPDATE accounts2
SET @id = + 1
OPTION ( MAXDOP 1 )
GO
-- использование уровня изоляции SERIALIZABLE - автор Tillman Dickson
-- это означает, что другие транзакции не могут модифицировать данные, которые читаются
-- текущей транзакций, пока текущая транзакция не завершится.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
DECLARE @id INT
SET @id = 0
UPDATE accounts2
SET @id = + 1
COMMIT TRANSACTION
Другой подход к обновлению последовательных значений
Вот еще один предложенный подход.
-- обновление строк с помощью CTE - автор Ervin Steckl
;WITH a AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as rn, id
FROM accounts2
)
UPDATE a SET /> OPTION (MAXDOP 1)
Заключение
Когда вы создали столбец identity, у вас нет простого способа перенумеровать значения для каждой строки. Подход на основе обновления позволяет это делать по мере необходимости простым выполнением запроса и изменением значений. Этот подход работает для всех версий SQL Server, а вариант с CTE — для SQL Server 2005 и выше.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Основы T-SQL. DML
Для добавления данных применяется команда INSERT , которая имеет следующий формальный синтаксис:
INSERT [INTO] имя_таблицы [(список_столбцов)] VALUES (значение1, значение2, . значениеN)
Вначале идет выражение INSERT INTO , затем в скобках можно указать список столбцов через запятую, в которые надо добавлять данные, и в конце после слова VALUES скобках перечисляют добавляемые для столбцов значения.
Например, пусть ранее была создана следующая база данных:
CREATE DATABASE productsdb; GO USE productsdb; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL )
Добавим в нее одну строку с помощью команды INSERT:
INSERT Products VALUES ('iPhone 7', 'Apple', 5, 52000)
После удачного выполнения в SQL Server Management Studio в поле сообщений должно появиться сообщение «1 row(s) affected»:

Стоит учитывать, что значения для столбцов в скобках после ключевого слова VALUES передаются по порядку их объявления. Например, в выражении CREATE TABLE выше можно увидеть, что первым столбцом идет Id. Но так как для него задан атрибут IDENTITY, то значение этого столбца автоматически генерируется, и его можно не указывать. Второй столбец представляет ProductName, поэтому первое значение — строка «iPhone 7» будет передано именно этому столбцу. Второе значение — строка «Apple» будет передана третьему столбцу Manufacturer и так далее. То есть значения передаются столбцам следующим образом:
- ProductName: ‘iPhone 7’
- Manufacturer: ‘Apple’
- ProductCount: 5
- Price: 52000
Также при вводе значений можно указать непосредственные столбцы, в которые будут добавляться значения:
INSERT INTO Products (ProductName, Price, Manufacturer) VALUES ('iPhone 6S', 41000, 'Apple')
Здесь значение указывается только для трех столбцов. Причем теперь значения передаются в порядке следования столбцов:
- ProductName: ‘iPhone 6S’
- Manufacturer: ‘Apple’
- Price: 41000
Для неуказанных столбцов (в данном случае ProductCount) будет добавляться значение по умолчанию, если задан атрибут DEFAULT, или значение NULL. При этом неуказанные столбцы должны допускать значение NULL или иметь атрибут DEFAULT.
Также мы можем добавить сразу несколько строк:
INSERT INTO Products VALUES ('iPhone 6', 'Apple', 3, 36000), ('Galaxy S8', 'Samsung', 2, 46000), ('Galaxy S8 Plus', 'Samsung', 1, 56000)
В данном случае в таблицу будут добавлены три строки.
Также при добавлении мы можем указать, чтобы для столбца использовалось значение по умолчанию с помощью ключевого слова DEFAULT или значение NULL:
INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VALUES ('Mi6', 'Xiaomi', DEFAULT, 28000)
В данном случае для столбца ProductCount будет использовано значение по умолчанию (если оно установлено, если его нет — то NULL).
Если все столбцы имеют атрибут DEFAULT, определяющий значение по умолчанию, или допускают значение NULL, то можно для всех столбцов вставить значения по умолчанию:
INSERT INTO Products DEFAULT VALUES
Но если брать таблицу Products, то подобная команда завершится с ошибкой, так как несколько полей не имеют атрибута DEFAULT и при этом не допускают значение NULL.