Добавить столбец в таблицу sql: Как добавить новый столбец в таблицу на SQL? | Info-Comp.ru
Как добавить новый столбец в таблицу на SQL? | Info-Comp.ru
Продолжаем изучать SQL и сегодня мы поговорим о том, как можно добавить новую колонку в уже существующую таблицу с данными. И как обычно рассмотрим примеры реализации этого в разных СУБД.
Очень часто бывает, что нужно добавлять колонки в существующие таблицы, которые уже находятся в работе и в них уже есть данные. Причины такой необходимости могут быть разные, например, добавилась еще одна характеристика и ее нужно хранить именно в этой таблице. Ну, в общем если Вы читаете эту статью, то у Вас возникла такая необходимость и сейчас мы с Вами научимся добавлять новые столбцы в таблицу.
Заметка! Профессиональный видеокурс по T-SQL для начинающих.
Добавляем колонку в таблицу в PostgreSQL
Сначала начнем разбирать пример на СУБД PostgreSQL. Допустим, у нас есть таблица «users» и в ней уже есть данные:
id | Name | Fam |
1 | User1 | Fam1 |
2 | User2 | Fam2 |
3 | User3 | Fam3 |
Другими словами у нас в таблице имеется:
- id – это уникальный идентификатор пользователя;
- Name – это имя пользователя;
- Fam – это фамилия пользователя.
У нас возникла необходимость добавить в нашу таблицу еще и отчество пользователя. Обращаю Ваше внимание на то, что перед добавлением новой колонке Вы должны определить, какой тип данных будет в этой колонке. В нашем примере подойдет тип varchar.
Переходим к добавлению столбца:
ALTER TABLE work.users ADD COLUMN otch VARCHAR (20)
где,
- ALTER TABLE – инструкция изменения таблицы;
- users – название нужной таблицы;
- work – схема, в которой расположена таблица;
- add column – инструкция добавления столбца;
- otch – название нашей новой колонки;
- varchar (20) – тип данных, 20 это максимальное количество символов.
Теперь после того, как Вы добавили колонку, можно обновить данные, например, добавим в строку со значением user1 отчество Otch2:
UPDATE work.users SET Otch = 'Otch2' WHERE name = 'User1'
После этого можете проверить данные, выполнив запрос на выборку с помощью нам уже известного оператора SELECT:
SELECT * FROM work.users WHERE name = 'User1'
Вы получите следующий результат:
id | Name | Fam | Otch |
1 | User1 | Fam1 | Otch2 |
Добавляем новую колонку в таблицу в MS SQL Server 2000
Думаю, что с PostgreSQL мы разобрались, а точнее научились добавлять колонки в существующие таблицы.
Теперь попробуем проделать то же самое в MS SQL Server 2000. Все исходные данные допустим, будут такими же.
Здесь запрос практически такой же, но все равно он немного отличается:
ALTER TABLE users ADD otch VARCHAR (20)
Здесь уже название схемы указывать необязательно (по умолчанию таблица будет определена на основе контекста подключения), а также ключевое слово column тоже нет необходимости писать. Давайте также обновим и проверим наши данные:
Обновление
UPDATE users SET Otch = ' Otch2' WHERE name = 'User1'
Проверка
SELECT * FROM users WHERE name = 'User1'
Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL, которую написал я, и в которой я подробно, и в то же время простым языком, рассказываю о языке SQL.
Вот и все! Надеюсь, Вам помог этот небольшой урок по добавлению колонок в существующие таблицы с использованием языка SQL. Удачи!
Нравится9Не нравится2
Добавление нового столбца таблицы в определенную порядковую позицию в Microsoft SQL Server
ответ да, это технически возможно, но у вас будет головная боль, делая это, и это займет много времени, чтобы выполнить и настроить.
Один: Создать/Копировать/Падение / Переименовать
это на самом деле то, что SQL Server делает в графическом интерфейсе: вот пример сценария, который он генерирует и выполняет, когда вы нажимаете кнопку «Сохранить» после добавления нового столбца в начало таблицы.
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_SomeTable
(
MyNewColumn int NOT NULL,
OriginalIntColumn int NULL,
OriginalVarcharColumn varchar(100) NULL
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT'
GO
GO
COMMIT
два: добавить СТОЛБЕЦ / ОБНОВИТЬ / УДАЛИТЬ СТОЛБЕЦ / ПЕРЕИМЕНОВАТЬ
этот метод в основном включает в себя создание копии всех существующих столбцов, которые вы хотите добавить в «право» вашего нового столбца, передачу данных в новый столбец, а затем удаление оригиналов и переименование новых. Это будет играть хаос с любыми индексами или ограничениями, которые у вас есть, так как вы должны их переустанавливать. Это технически возможно, но опять же отнимает много времени как с точки зрения разработки, так и с точки зрения исполнения.
CREATE TABLE MyTest (a int, b int, d int, e int)
INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)
SELECT * FROM MyTest -- your current table
ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int
UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns
ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e
EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';
SELECT * FROM MyTest
DROP TABLE MyTest -- clean up the sample
три: жить с этим
Запрос SQL на добавление и удаление записей
Вы здесь:
Главная — MySQL — SQL — Запрос SQL на добавление и удаление записей
В этой статье мы разберём, пожалуй, одни из самых важных SQL-запросов. Это запросы на добавление и удаление записей из таблицы базы данных. Поскольку, ОЧЕНЬ часто приходится добавлять новые записи в таблицу, причём делать это в автоматическом режиме, то данный материал обязателен к изучению.
Для начала SQL-запрос на добавление новой записи в таблицу:
INSERT INTO users (login, pass) values('TestUser', '123456')
При добавлении записи вначале идёт команда «INSERT INTO«, затем название таблицы, в которую мы вставляем запись. Далее идёт в круглых скобках названия полей, которые мы хотим заполнить. А затем в круглых скобках после слова «values» начинаем перечислять значения тех полей, которые мы выбрали. После выполнения этого запроса в нашей таблице появится новая запись.
Иногда требуется обновить запись в таблице, для этого существует следующий SQL-запрос:
UPDATE users SET login = 'TestUser2', pass='1234560' WHERE login='TestUser'
Данный запрос является более сложным, так как он имеет конструкцию «WHERE«, но о ней чуть ниже. Вначале идёт команда «UPDATE«, затем имя таблицы, а после «SET» мы описываем значения всех полей, которые мы хотим изменить. Было бы всё просто, но встаёт вопрос: «А какую именно запись следует обновлять?«. Для этого существует «WHERE«. В данном случае мы обновляем запись, поле «login» у которой имеет значение «TestUser«. Обратите внимание, что если таких записей будет несколько, то обновятся абсолютно все! Это очень важно понимать, иначе Вы рискуете потерять свою таблицу.
Давайте немного ещё поговорим о «WHERE«. Помимо простых проверок на равенство существуют так же и неравенства, а также логические операции: AND и OR.
UPDATE users SET login = 'TestUser2', pass='1234560' WHERE id < 15 AND login='TestUser'
Данный SQL-запрос обновит те записи, id которых меньше 15 И поле «login» имеет значение «TestUser«. Надеюсь, Вы разобрались с конструкцией «WHERE«, потому что это очень важно. Именно «WHERE» используется при выборке записей из таблиц, а это самая частоиспользуемая задача при работе с базами данных.
И, напоследок, простой SQL-запрос на удаление записей из таблицы:
DELETE FROM users WHERE login='TestUser2'
После команды «DELETE FROM» идёт имя таблицы, в которой требуется удалить записи. Дальше описываем конструкцию «WHERE». Если запись будет соответствовать описанным условиям, то она будет удалена. Опять же обратите внимание, в зависимости от количества записей, удовлетворяющих условию после «WHERE«, может удалиться любое их количество.
Вот Вы и узнали, как добавлять, обновлять и удалять записи из таблицы. А в следующей статье я Вас познакомлю с тем, как делать выборку записей из таблицы, а это является, пожалуй, самым важным при работе с базами данных.
Полный курс по PHP и MySQL: http://srs.myrusakov.ru/php
-
Создано 16.01.2011 17:44:14 -
Михаил Русаков
Предыдущая статья Следующая статья
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
<a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>Она выглядит вот так:
-
Текстовая ссылка:
<a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
[URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]
Добавить столбец со значением по умолчанию в существующую таблицу в SQL Server
Чтобы добавить столбец в существующую базу данных со значением по умолчанию, мы можем использовать:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
Вот еще один способ добавить столбец в существующую базу данных со значением по умолчанию.
Более подробный SQL script для добавления столбца со значением по умолчанию ниже, включая проверку наличия столбца перед добавлением его, также проверите ограничение и отбросьте его, если он есть. Этот script также называет ограничение, поэтому мы можем иметь красивое соглашение об именах (мне нравится DF_), и если SQL не даст нам ограничения с именем, которое имеет случайно сгенерированное число; поэтому неплохо было бы также указать ограничение.
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
Это два способа добавить столбец в существующую базу данных со значением по умолчанию.
Microsoft SQL Server — ВЫБРАТЬ все строки и столбцы из таблицы
пример
Синтаксис:
SELECT *
FROM table_name
Использование оператора asterisk *
служит ярлыком для выбора всех столбцов в таблице. Все строки также будут выбраны, потому что этот SELECT
не имеет предложения WHERE
, чтобы указать любые критерии фильтрации.
Это также будет работать так же, если вы добавили псевдоним в таблицу, например e
в этом случае:
SELECT *
FROM Employees AS e
Или, если вы хотите выбрать все из конкретной таблицы, вы можете использовать псевдоним + «. *»:
SELECT e.*, d.DepartmentName
FROM Employees AS e
INNER JOIN Department AS d
ON e.DepartmentID = d.DepartmentID
К объектам базы данных также можно получить доступ с использованием полных имен:
SELECT * FROM [server_name].[database_name].[schema_name].[table_name]
Это не обязательно рекомендуется, так как изменение имени сервера и / или базы данных приведет к тому, что запросы с использованием полностью квалифицированных имен перестанут выполняться из-за неправильных имен объектов.
Обратите внимание, что поля before table_name
могут быть опущены во многих случаях, если запросы выполняются на одном сервере, базе данных и схеме соответственно. Однако для базы данных часто существует несколько схем, и в этих случаях имя схемы не должно быть опущено, когда это возможно.
Предупреждение. Использование SELECT *
в производственном коде или хранимых процедурах может привести к проблемам позже (при добавлении новых столбцов в таблицу или перестановке столбцов в таблице), особенно если ваш код делает простые предположения о порядке столбцов, или количество возвращенных столбцов. Поэтому безопаснее всегда явно указывать имена столбцов в операторах SELECT для производственного кода.
SELECT col1, col2, col3
FROM table_name
Создание и удаление таблиц
Создание таблицы
Перед созданием таблицы необходимо выбрать базу данных, в которую таблица будет записана. Это делается с помощью оператора USE:
USE имя_базы_данных;
Для создания таблицы используется оператор CREATE TABLE. Его базовый синтаксис имеет следующий вид:
CREATE TABLE [IF NOT EXIST] имя_таблицы (
колонка_1 тип_данных,
[колонка_2 тип_данных,]
...
[колонка_n тип_данных,]
);
Например, создадим таблицу пользователей.
CREATE TABLE Users (
id INT,
name VARCHAR(255),
age INT
);
INT, VARCHAR(255) — типы данных: числовой и строковый соответственно. Более подробно о них можно будет узнать в следующих статьях.
Дополнительные параметры определения колонок
Вышеприведенное определение колонок в таблице является упрощенным. Помимо названия колонки и ее типа в определение иногда необходимо добавлять следующие необязательные параметры:
- PRIMARY KEY
Указывает колонку или множество колонок как первичный ключ.
- AUTO_INCREMENT
Указывает, что значение данной колонки будет автоматически увеличивается при добавление новых записей в таблицу. Каждая таблица имеет максимум одну AUTO_INCREMENT колонку. Стоит отметить, что данный параметр можно применять только к целочисленным типам и к типам с плавающей запятой.
- UNIQUE
Указывает, что значения в данной колонке для всех записей должны быть отличными друг от друга.
- NOT NULL
Указывает, что значения в данной колонке должны быть отличными от NULL.
- DEFAULT
Указывает значение по умолчанию. Данный параметр не применяется к типам BLOB, TEXT, GEOMETRY и JSON.
Для нашей таблицы пользователей можно указать следующие параметры:
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
age INT NOT NULL DEFAULT 18
);
Так в данном примере
- id — поле числового типа, являющееся первичным ключом;
- name — поле строкового типа с максимальной длиной в 255 символов, являющееся обязательным к заполнению;
- age — поле числового типа со значением по умолчанию равным 18.
Описание таблицы
Для того, чтобы посмотреть описание созданной таблицы можно воспользоваться оператором DESCRIBE.
Дополнительные параметры определения таблицы
Помимо описания колонок при создании таблицы можно дополнительно указать следующие параметры:
- Первичный ключ
Если вы не определили ключ с помощью параметров к колонке, то это можно сделать с помощью параметров к таблице.
CREATE TABLE Users ( id INT, name VARCHAR(255) NOT NULL, age INT NOT NULL DEFAULT 18, PRIMARY KEY (id) );
- Внешние ключи
Добавим в таблицу Users поле company — место работы нашего пользователя, которое будет ссылаться на запись в таблице Companies.
CREATE TABLE Users ( id INT, name VARCHAR(255) NOT NULL, age INT NOT NULL DEFAULT 18, company INT, PRIMARY KEY (id) );
Для такого, чтобы при добавлении новых записей в таблицу Users гарантировать, что в колонке company находится идентификатор, существующий в таблице Companies, используется внешний ключ. Он имеет следующий синтаксис:
CREATE TABLE Users ( id INT, name VARCHAR(255) NOT NULL, age INT NOT NULL DEFAULT 18, company INT, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) );
При наличии внешних ключей можно определить поведение текущей записи при изменении или удалении записи, на которую запись ссылается.
CREATE TABLE Users ( id INT, name VARCHAR(255) NOT NULL, age INT NOT NULL DEFAULT 18, company INT, PRIMARY KEY (id), FOREIGN KEY (company) REFERENCES Companies (id) ON DELETE RESTRICT ON UPDATE CASCADE );
ON DELETE RESTRICT означает, что если попробовать удалить компанию, у которой в таблице Users есть данные, база данных не даст этого сделать:
Cannot delete or update a parent row: a foreign key constraint fails
Если бы было указано ON DELETE CASCADE, то при удалении компании были бы удалены все пользователи, ссылающиеся на эту компанию.
Есть еще одна опция — ON DELETE SET NULL. При ее использовании база данных запишет NULL в качестве значения поля company для всех пользователей, работавших в удаленной компании.
ON UPDATE CASCADE означает, что если компания изменить свой идентификатор, то все пользователи (Users) получат новый идентификатор в поле company.
Удаление таблицы
Удаление таблицы производится при помощи оператора DROP TABLE.
DROP TABLE [IF EXIST] имя_таблицы;
SQL Операции добавления столбца
В этой статье объясняется операция добавления столбца SQL в существующую таблицу SQL. Мы также рассмотрим различные примеры SQL-операций добавления столбцов.
Иногда мы хотим добавить столбцы в существующую таблицу. В существующих таблицах у нас могут быть записи. Мы также не хотим потерять существующие данные. Во многих случаях мы можем отбросить таблицы и воссоздать их, но обычно это не рекомендуется, особенно в производственной среде, так как это может быть разрушительным в отношении данных.Мы по-прежнему можем выполнять операцию добавления столбца SQL с помощью команды Alter Table, что позволяет избежать необходимости отбрасывать таблицы и удалять данные, даже если это только временно.
Синтаксис
Мы можем выполнить SQL-операцию добавления столбца в таблице с помощью следующей команды Transact SQL.
ALTER TABLE имя_таблицы ДОБАВИТЬ имя_столбца определение_столбца; |
Подготовить среду
Нам нужно выбрать таблицу базы данных и вставить в нее данные.
Выполните следующий запрос, чтобы создать таблицу Employee в базе данных SQLShackDemo .
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 | ИСПОЛЬЗОВАТЬ [SQLShackDemo] GO УСТАНОВИТЬ ANSI_NULLS НА GO НАСТРОИТЬ QUOTED_IDENTIFIER НА GO СОЗДАТЬ ТАБЛИЦУ [СОЗДАТЬ dbo.[Сотрудник] ( [EmpID] [int] IDENTITY (1,1) NOT NULL, [EmpName] [varchar] (50) NULL, [City] [varchar] (30) NULL, [ Обозначение] [varchar] (30) NULL, PRIMARY KEY CLUSTERED ( [EmpID] ASC ) С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_PLOCKS = ONLOCKS = ON) [PRIMARY] ) ON [PRIMARY] GO |
Выполните следующий запрос, чтобы вставить в него образцы данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 21 22 23 24 25 26 27 28 29 30 000 34 35 36 37 38 39 40 41 42 43 44 45 46 49 0002 47 00030002 47 0003 51 52 53 54 55 56 57 58 59 60 61 62 63 9 0002 64 65 66 67 68 69 70 71 72 73 74 75 76 77 81 82 83 84 85 86 87 88 89 90 91 92 93 000 93 000 97 98 99 100 101 102 103 104 105 106 107 108 109 1102 109 1102 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | ИСПОЛЬЗОВАНИЕ [SQLShackDemo]; GO ВСТАВИТЬ В [dbo].[Сотрудник] ([EmpID], [EmpName], [City], [Наименование] ) ЗНАЧЕНИЯ (1, N’Charlotte Robinson ‘, N Чикаго ‘, N’Consultant’ ); GO INSERT INTO [dbo]. [Сотрудник] ([EmpID], [EmpName], [City], [Назначение] ) VALUES (2 N’Madison Phillips ‘, N’Dallas’, N’Senior Analyst ‘ ); GO ВСТАВИТЬ В [dbo].[Сотрудник] ([EmpID], [EmpName], [City], [Наименование] ) ЗНАЧЕНИЯ (3, N’Emma Hernandez ‘, N’Emma Hernandez’, Phoenix ‘, N’Senior Analyst’ ); GO INSERT INTO [dbo]. [Сотрудник] ([EmpID], [EmpName], [City], [Назначение] ) VALUES (4 N’Samantha Sanchez ‘, N’San Diego’, N’Principal Conultant ‘ ); GO ВСТАВИТЬ В [dbo].[Сотрудник] ([EmpID], [EmpName], [City], [Наименование] ) ЗНАЧЕНИЯ (5, N’Sadie Ward ‘, N’ Сан-Антонио ‘, N’Consultant’ ); GO INSERT INTO [dbo]. [Сотрудник] ([EmpID], [EmpName], [City], [Назначение] ) VALUES (6 N’Savannah Perez ‘, N’New York’, N’Principal Conultant ‘ ); GO ВСТАВИТЬ В [dbo].[Сотрудник] ([EmpID], [EmpName], [City], [Наименование] ) ЗНАЧЕНИЯ (7, N’Victoria Gray ‘, N’ Лос-Анджелес ‘, N’Assistant’ ); GO INSERT INTO [dbo]. [Сотрудник] ([EmpID], [EmpName], [City], [Назначение] ) VALUES (8 N’Alyssa Lewis ‘, N’Houston’, N’Consultant ‘ ); GO ВСТАВИТЬ В [dbo].[Сотрудник] ([EmpID], [EmpName], [City], [Наименование] ) ЗНАЧЕНИЯ (9, N’Anna Lee ‘, N’ Сан-Хосе ‘, N’Principal Conultant’ ); GO INSERT INTO [dbo]. [Сотрудник] ([EmpID], [EmpName], [City], [Назначение] ) VALUES (10 N’Riley Hall ‘, N’Philadelphia’, N’Senior Analyst ‘ ); GO SET IDENTITY_INSERT [dbo].[Сотрудник] ВЫКЛ; ГО |
На следующем снимке экрана мы видим существующие данные в таблице Employee .
Операция добавления столбца SQL в существующую таблицу SQL
Мы хотим добавить столбец Department в таблицу Employee . Предположим, у нас много столбцов в таблице; нам нужно проверить, существует ли конкретный столбец в таблице SQL или нет.Если указанный столбец не существует, мы хотим создать его с соответствующим типом данных.
Мы можем использовать представление INFORMATION_SCHEMA для проверки таблиц и их столбцов в базе данных. Выполните следующий код, чтобы получить список столбцов и их тип данных в таблице Employee.
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.КОЛОНКИ ГДЕ ИМЯ ТАБЛИЦЫ = «Сотрудник»; |
В этом выводе мы видим, что таблица Employee содержит 4 столбца.
Давайте добавим новый столбец «Отдел» с помощью следующей команды Alter Table .
ИЗМЕНИТЬ ТАБЛИЦУ Сотрудник ДОБАВИТЬ Отдел Варчар (50) |
Выполните этот запрос и выберите записи из таблицы Employee.На следующем снимке экрана мы видим новую колонку Department. Все существующие записи содержат в этом столбце значение NULL.
Ранее мы проверяли все столбцы в таблице Employee, используя представление INFORMATION_SCHEMA . В следующем запросе мы хотим создать таблицу Department , только если ее нет в таблице Employee .
ЕСЛИ НЕ СУЩЕСТВУЕТ ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‘Employee’ AND COLUMN_NAME = ‘Department’ ) BEGIN ALTER TABLE Employee ADD Department VARCHAR (50); КОНЕЦ; |
Мы можем добавить столбец в существующую таблицу, если он допускает значения NULL или для него определено значение по умолчанию. Мы можем попытаться добавить столбец Not NULL в существующую таблицу SQL, но это даст следующее сообщение об ошибке:
ЕСЛИ НЕ СУЩЕСТВУЕТ ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ‘Employee’ AND COLUMN_NAME = ‘Phone’ ) BEGIN ALTER TABLE Employee ADD Phone VARCHAR (15) Not NULL; КОНЕЦ; |
SQL-операция добавления столбца в существующую таблицу SQL со значением по умолчанию
Предположим, мы хотим добавить столбец IsActive в таблицу сотрудников.В этом столбце могут быть следующие значения
- Значение 1: Сотрудник активен
- Значение 0 : Сотрудник неактивен
По умолчанию у всех существующих и новых сотрудников должно быть значение 1 в столбце IsActive . Мы можем указать значение, используя ограничение по умолчанию.
Если мы попытаемся добавить столбец со значением Not NULL в существующую таблицу SQL, мы получим следующее сообщение об ошибке:
SQL Server ALTER TABLE ADD Обзор столбца
В этой статье мы рассмотрим операторы SQL Server ALTER TABLE ADD Column для добавления столбцов в существующую таблицу.Мы также поймем влияние добавления столбца со значением по умолчанию, а также добавления и обновления столбца со значением позже в более крупных таблицах.
Как разработчику базы данных, вам также необходимо добавлять столбцы в существующие таблицы. Вы можете подумать, что добавление столбца в таблицу базы данных SQL Server не будет большой проблемой. Иногда вы можете добавлять столбец из самой SQL Server Management Studio. Что ж, это было бы хорошо для небольшой таблицы или таблицы, в которой нет большого количества транзакций.Давайте посмотрим, как можно добавлять столбцы в существующую таблицу, а также поймем причины и передовые методы добавления столбца в таблицу большого размера.
Образец таблицы
Давайте создадим образец таблицы с достаточным набором данных из следующего скрипта.
ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ Sys.tables, где Name = ‘SampleTable’) DROP TABLE SampleTable CREATE TABLE dbo.SampleTable ( ID BIGINT IDENTITY (1,1) NOT NULL PRIMARY KEY CLUSTERED, DateTime4 DATETIME DEFAULT GETDATE (), Column1 CHAR (1000) DEFAULT ‘МММММММММММММГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГГ ) |
Приведенный выше сценарий создаст образец таблицы с именем SampleTable . Поля данных добавлены, так что будет создана таблица большого размера. Затем было добавлено большое количество записей путем многократного выполнения следующего запроса.
SET NOCOUNT ON INSERT INTO SampleTable (DateTime4, Column1, Column2) VALUES (GETDATE (), ‘XXXX’, ‘YYYY’) GO 500000 |
После выполнения вышеуказанного запроса 500000 записей обновляются до SampleTable . После выполнения вышеуказанного запроса следует размер таблицы и другие параметры для таблицы.
Его можно получить с помощью процедуры sp_spaceused ‘SampleTable’
Ниже указан размер базы данных для данных и файла журнала.
Давайте быстро рассмотрим синтаксис добавления одного столбца в существующую таблицу с помощью оператора ALTER TABLE ADD, как показано ниже.
ALTER TABLE имя_таблицы ДОБАВИТЬ имя_столбца тип_данных col_constraint; |
Вы можете использовать приведенный ниже оператор, чтобы добавить столбец NewColumn1 в нашу таблицу SampleTable.
ALTER TABLE SampleTable ADD NewColumn1 varchar (200) |
Кроме того, вы можете добавить несколько столбцов в таблицу, используя один оператор SQL Server ALTER TABLE, как показано ниже.
ALTER TABLE SampleTable ADD NewColumn2 varchar (20), NewColumn3 varchar (50) |
При добавлении столбца в большую таблицу обычно требуется добавить столбец и заполнить добавленный столбец значением по умолчанию.Например, если вы хотите добавить столбец статуса, следующий шаг — заполнить столбец значением по умолчанию.
Добавление столбца с ограничениями по умолчанию
Для достижения вышеуказанной цели самый простой способ — добавить столбец с ограничением по умолчанию. Когда добавляется столбец по умолчанию, в таблицу будет добавлено значение по умолчанию. Следующий скрипт использует оператор SQL Server ALTER TABLE ADD Column (в нашем случае статус), чтобы добавить столбец с именем Status с ограничением по умолчанию.
ALTER TABLE SampleTable ADD Status CHAR (5000) DEFAULT ‘INC’ СО ЗНАЧЕНИЯМИ |
При добавлении столбца, как указано выше, столбец состояния будет добавлен со значением INC для всех записей.
Из профилировщика следующие статические данные собираются через SQL Profiler во время добавления столбца со значениями по умолчанию.
ЦПУ | 0 |
Читает | 185 |
Пишет | 0 |
Продолжительность Милл Секунды | 65 |
Вы можете видеть, что столбец добавляется в таблицу менее чем за одну секунду, а операция требует минимальных затрат.
Ниже приведены статистические данные о блокировках в столбце, которые добавлены с ограничением.
Тип ресурса | Подтип ресурса | Режим запроса | Количество записей |
БАЗА ДАННЫХ | S | 1 | |
БАЗА ДАННЫХ | DDL | S | 1 |
КЛЮЧ | Икс | 11 | |
МЕТАДАННЫЕ | DATA_SPACE | Щ-С | 1 |
ОБЪЕКТ | IX | 6 | |
ОБЪЕКТ | Щ-М | 2 |
Обратите внимание, что следующий запрос должен быть выполнен в открытой транзакции, чтобы получить приведенную выше статистику блокировок.
ВЫБРАТЬ resource_type, resource_subtype, request_mode, COUNT (*) FROM sys.dm_tran_locks WHERE request_session_id = @@ SPID _mode_project _Resource_type2, 9000 BY 9_type, resource |
Это показывает, что таблица (объект) имеет намеренную монопольную блокировку, что означает, что таблица не блокируется исключительно во время добавления столбца.Кроме того, добавление столбца со значением по умолчанию не заняло и одной минуты, хотя в нем 500 000 записей.
Посмотрим на размер таблицы.
Вы увидите, что ничего не изменилось.
Давайте посмотрим размеры файлов базы данных.
В файле данных, как и в файле журнала, ничего особенного не изменилось. Все эти результаты показывают, что добавление столбца с ограничением по умолчанию приведет только к изменению метаданных.
Обновление со значением
Давайте обновим тот же столбец другим значением и получим ту же статистику.
Тип ресурса | Режим запроса | Количество записей |
БАЗА ДАННЫХ | S | 1 |
ОБЪЕКТ | Икс | 1 |
В приведенной выше таблице показано, что таблица заблокирована исключительно, что означает, что таблица недоступна во время обновления.
Посмотрим на размер стола.
Таблица увеличилась на некоторое значение, как показано на рисунке выше.
Ниже приведены сведения о затратах на запросы, полученные с помощью SQL Profiler.
ЦПУ | 29 781 |
Читает | 9 188 986 |
Пишет | 527 436 |
Продолжительность Милл Секунды | 1,113,142 |
Очевидно, что при обновлении столбца для большой таблицы потребление ресурсов велико.
Ниже приведены размеры файлов базы данных при добавлении столбца и обновлении значений.
Эта статистика показывает, что существует значительная разница между добавлением столбца со значением по умолчанию и добавлением столбца и последующим обновлением столбца со значением. Во время обновления столбца журнал транзакций будет увеличиваться, и для таблицы будет установлена монопольная блокировка, запрещающая любое чтение или запись в таблицу.
В чем разница в этих сценариях? До SQL Server 2012 при добавлении столбца со значением по умолчанию будет такое же поведение. В SQL Server 2012 и более поздних версиях такой ситуации больше нет, столбец добавляется в таблицу в интерактивном режиме, и обновление не происходит, это только изменение метаданных.
Как это достигается
Это достигается довольно простым, но новым подходом. sys.system_internals_partition_columns DMV имеет два дополнительных столбца с именами has_default и default_value , как показано ниже.
Поэтому, когда столбец добавлен со значением по умолчанию, он не будет обновлять страницу данных, вместо этого он обновит эту системную таблицу. Когда строка обновляется, значение по умолчанию будет помещено в таблицу, даже если столбец значений по умолчанию не обновлен.
Теперь следующий вопрос: что, если ограничение по умолчанию будет отброшено сразу после его создания. В этом сценарии все равно будет преобладать вышеуказанный параметр, поэтому будет сохранено ранее установленное значение по умолчанию.
Заключение
В этой статье мы рассмотрели базовый синтаксис SQL Server ALTER TABLE и реализовали его для добавления столбцов в существующую таблицу.
До SQL Server 2012 не было разницы между добавлением столбца со значением по умолчанию и добавлением столбца и его обновлением. Поэтому в предыдущую эпоху SQL Server 2012, вместо добавления столбца с ограничением по умолчанию, лучше добавить столбец и обновлять его пакетами, чтобы таблица не была монопольно заблокирована.
Однако, начиная с SQL Server 2012, подход изменился, поэтому добавление столбца с ограничениями по умолчанию стало намного лучше.
Динеш Асанка является MVP в категории SQL Server за последние 8 лет. Он работает с SQL Server более 15 лет, пишет статьи и является соавтором книг. Он является докладчиком в различных группах пользователей и университетах. Он всегда готов учиться и делиться своими знаниями.
Посмотреть все сообщения от Динеш Асанка
Последние сообщения от Динеш Асанка (посмотреть все)
ALTER TABLE — Документация Databricks
ALTER TABLE
Оператор изменяет схему или свойства таблицы.
ПЕРЕИМЕНОВАТЬ
Оператор ALTER TABLE RENAME TO
изменяет имя существующей таблицы в базе данных.
Синтаксис
ALTER TABLE идентификатор_таблицы ПЕРЕИМЕНОВАТЬ НА идентификатор_таблицы ALTER TABLE идентификатор_таблицы спецификация_раздела ПЕРЕИМЕНОВАТЬ в спецификацию_раздела
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных.] имя_таблицы
partition_spec
Раздел, который нужно переименовать.
Синтаксис:
РАЗДЕЛ (имя_столбца раздела = значение_столбца раздела [, ...])
ДОБАВИТЬ КОЛОНКИ
ALTER TABLE ADD COLUMNS
Оператор добавляет указанные столбцы в существующую таблицу.
Синтаксис
ALTER TABLE table_identifier ADD COLUMNS (col_spec [, ...])
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных. ] имя_таблицы
КОЛОННЫ (col_spec)
Задает добавляемые столбцы.
ИЗМЕНИТЬ ИЛИ ИЗМЕНИТЬ КОЛОНКУ
ALTER TABLE ALTER COLUMN
или ALTER TABLE CHANGE COLUMN
инструкция изменяет определение столбца.
Синтаксис
ALTER TABLE идентификатор_таблицы {ALTER | ИЗМЕНИТЬ} [COLUMN] col_spec alterColumnAction
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных. ] имя_таблицы
КОЛОННЫ (col_spec)
Определяет столбец, который нужно изменить или изменить.
alterColumnAction
Изменить определение столбца.
ДОБАВИТЬ И УДАЛИТЬ РАЗДЕЛ
ДОБАВИТЬ РАЗДЕЛ
Оператор ALTER TABLE ADD
добавляет раздел в многораздельную таблицу.
Синтаксис
ALTER TABLE идентификатор_таблицы ДОБАВИТЬ [ЕСЛИ НЕ СУЩЕСТВУЕТ] (спецификация_раздела [спецификация_раздела...])
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных. ] имя_таблицы
partition_spec
Раздел, который нужно добавить.
Синтаксис:
РАЗДЕЛ (имя_столбца раздела = значение_столбца раздела [, ...])
КАПЕЛЬНАЯ ПЕРЕГОРОДКА
Оператор ALTER TABLE DROP
удаляет раздел таблицы.
Синтаксис
ALTER TABLE идентификатор_таблицы DROP [IF EXISTS] спецификация_раздела [PURGE]
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных. ] имя_таблицы
partition_spec
Раздел, который нужно удалить.
Синтаксис:
РАЗДЕЛ (имя_столбца_раздела = значение_стол_ раздела [,...])
УСТАНОВИТЬ И ОТКРЫТЬ
НАБОР СВОЙСТВА СТОЛА
ALTER TABLE SET
команда используется для установки свойств таблицы. Если определенное свойство уже было установлено,
это заменяет старое значение новым.
ALTER TABLE UNSET
используется для удаления свойства таблицы.
Синтаксис
- Установить свойства таблицы ALTER TABLE table_identifier SET TBLPROPERTIES (ключ1 = значение1, ключ2 = значение2, ...) - Снять свойства таблицы ALTER TABLE идентификатор_таблицы UNSET TBLPROPERTIES [IF EXISTS] (key1, key2,...)
НАБОР SERDE
ALTER TABLE SET
команда используется для установки свойств SERDE или SERDE в таблицах Hive. Если определенное свойство уже было установлено, оно заменяет старое значение новым.
Синтаксис
- Установить свойства SERDE ALTER TABLE идентификатор_таблицы [спецификация_раздела] УСТАНОВИТЬ СВОЙСТВА SERDEPROPERTIES (ключ1 = значение1, ключ2 = значение2, ...) ALTER TABLE идентификатор_таблицы [спецификация_раздела] SET SERDE serde_class_name [С СВОЙСТВАМИ SERDEPROPERTIES (ключ1 = значение1, ключ2 = значение2,...)]
УСТАНОВИТЬ МЕСТОПОЛОЖЕНИЕ И УСТАНОВИТЬ ФОРМАТ ФАЙЛА
ALTER TABLE SET Команда
также может использоваться для изменения местоположения файла и формата файла для
существующие таблицы.
Синтаксис
- Изменение формата файла ALTER TABLE table_identifier [partition_spec] SET FILEFORMAT file_format - Изменение местоположения файла ALTER TABLE table_identifier [partition_spec] SET LOCATION 'new_location'
Параметры
идентификатор_таблицы
Задает имя таблицы, которое может быть дополнено именем базы данных.
Синтаксис:
[имя_базы_данных. ] имя_таблицы
partition_spec
Указывает раздел, для которого должно быть установлено свойство.
Синтаксис:
РАЗДЕЛ (имя_столбца раздела = значение_столбца раздела [, ...])
СВОЙСТВА SERDEPROPERTIES (ключ1 = значение1, ключ2 = значение2,…)
Задает устанавливаемые свойства SERDE.
Конструкции схемы озера Дельта
Delta Lake поддерживает дополнительные конструкции для изменения схемы таблицы: добавление, изменение и замена столбцов.
Примеры добавления, изменения и замены столбцов см. В разделе «Явное обновление схемы».
Добавить столбцы
ALTER TABLE имя_таблицы ДОБАВИТЬ СТОЛБЦЫ (имя_столбца тип_данных [КОММЕНТАРИЙ, комментарий_столбца] [ПЕРВЫЙ | ПОСЛЕ имя_столбца], ...) ALTER TABLE имя_таблицы ДОБАВИТЬ СТОЛБЦЫ (имя_столбца.nested_col_name тип_данных [КОММЕНТАРИЙ, комментарий_столбца] [ПЕРВЫЙ | ПОСЛЕ имя_столбца], ...)
Добавить столбцы в существующую таблицу. Он поддерживает добавление вложенного столбца. Если столбец с таким именем уже существует в таблице или такой же вложенной структуре, выдается исключение.
Изменить столбцы
ALTER TABLE имя_таблицы (ALTER | CHANGE) [COLUMN] alterColumnAction ALTER TABLE имя_таблицы (ALTER | CHANGE) [COLUMN] alterColumnAction alterColumnAction: : TYPE dataType : [КОММЕНТАРИЙ col_comment] : [ПЕРВЫЙ | ПОСЛЕ colA_name] : (SET | DROP) NOT NULL
Изменить определение столбца существующей таблицы. Вы можете изменить тип данных, комментарий, возможность пустого значения столбца или изменить порядок столбцов.
Примечание
Доступно в Databricks Runtime 7.0 и выше.
Изменить столбцы (синтаксис Hive)
ALTER TABLE имя_таблицы ИЗМЕНИТЬ [COLUMN] col_name col_name data_type [COMMENT col_comment] [FIRST | AFTER colA_name] ALTER TABLE имя_таблицы ИЗМЕНИТЬ [COLUMN] col_name.nested_col_name col_name data_type [COMMENT col_comment] [FIRST | AFTER colA_name]
Изменить определение столбца существующей таблицы. Вы можете изменить комментарий столбца и изменить порядок столбцов.
Примечание
в среде выполнения Databricks 7.0 и выше нельзя использовать ИЗМЕНИТЬ КОЛОНКУ
:
- Для изменения содержимого сложных типов данных, таких как структуры. Вместо этого используйте
ADD COLUMNS
для добавления новых столбцов во вложенные поля илиALTER COLUMN
для изменения свойств вложенного столбца. - Чтобы ослабить допустимость значений NULL для столбца в дельта-таблице. Вместо этого используйте
ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца DROP NOT NULL
.
Заменить колонки
ALTER TABLE имя_таблицы REPLACE COLUMNS (col_name1 col_type1 [COMMENT col_comment1],...)
Заменить определения столбцов существующей таблицы. Он поддерживает изменение комментариев столбцов, добавление столбцов и изменение порядка столбцов. Если указанные определения столбцов несовместимы с существующими определениями, создается исключение.
Добавление строк в таблицу с помощью столбца идентификаторов | Интерактивное руководство по SQL
Многие коммерческие продукты позволяют использовать автоматически увеличиваемые столбцы, т.е. столбцы, которые автоматически формируют свои значения при добавлении новых строк.Такие столбцы широко используются в качестве первичных ключей в таблицах в силу уникальности этих значений. Типичным примером этого столбца является последовательный счетчик, который генерирует значение на 1 больше, чем предыдущее значение (значение, полученное при добавлении предыдущей строки).
Ниже приведен пример создания таблицы со столбцом IDENTITY (код , ) в MS SQL (язык структурированных запросов) — компьютерный язык баз данных, предназначенный для поиска и управления данными в системах управления реляционными базами данных (СУБД). , создание и изменение схемы базы данных и управление контролем доступа к объектам базы данных.SQL Server.
СОЗДАТЬ ТАБЛИЦУ Printer_Inc
(
код int IDENTITY (1,1) PRIMARY KEY,
модель varchar (4) NOT NULL,
- 1 NOT NULL цвет char ,
type varchar (6) NOT NULL,
price float NOT NULL
);
Автоинкрементируемый столбец определяется функцией IDENTITY (1, 1), где первый параметр (начальное значение) — это значение, которое должно быть присвоено первой строке в таблице, а второе — приращение, добавляемое к начальному значению для следующих друг за другом строк. в таблице.Итак, в этом примере первая вставленная строка получает в столбце кода значение 1, вторая строка — 2 и так далее.
Поскольку значение в столбце кода формируется автоматически, выписка
INSERT INTO Printer_Inc
ЗНАЧЕНИЯ (15, 3111, 'y', 'laser', 599);
вызывает ошибку, даже если в таблице нет строки со значением 15 в столбце кода. Таким образом, мы не будем включать этот столбец при добавлении строки в таблицу, как мы это делаем при использовании значения по умолчанию, i.е.
INSERT INTO Printer_Inc (модель, цвет, тип, цена)
VALUES (3111, 'y', 'laser', 599);
В результате информация о модели 3111 для цветного лазерного принтера стоимостью 2599 долларов будет добавлена в таблицу Printer_Inc. Значение в столбце code 15 случайно. В большинстве случаев конкретное значение в столбце идентификаторов не имеет значения, поскольку это значение, как правило, не имеет смысла; Первый момент — уникальность стоимости.
Тем не менее, бывают случаи, когда необходимо вставить определенное значение в автоматически увеличивающиеся столбцы. Это происходит, например, когда существующие данные необходимо перенести в новую структуру. При этом эти данные находятся во взаимосвязи «один ко многим» со стороны «один». Таким образом, здесь не допускаются произвольные значения. С другой стороны, мы хотим использовать автоинкрементируемое поле позже.
Из-за отсутствия автоматически увеличиваемых столбцов в стандарте SQL не существует единого подхода.Здесь реализация в MS SQL Server. Заявление
SET IDENTITY_INSERT TABLE name> {ON | ВЫКЛ};
выключите (значение ON) или включите (значение OFF) использование автоматического увеличения. Таким образом, чтобы добавить строку со значением 15 в столбец кода, мы можем написать
УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;
INSERT INTO Printer_Inc (код, модель, цвет, тип, цена)
VALUES (15, 3111, 'y', 'laser', 599);
Обратите внимание, что в этом случае необходим список столбцов, т.е.е. мы не можем ни написать:
УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;
INSERT INTO Printer_Inc
ЗНАЧЕНИЯ (15, 3111, 'y', 'laser', 599);
ни
УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;
INSERT INTO Printer_Inc (модель, цвет, тип, цена)
VALUES (3111, 'y', 'laser', 599);
В последнем случае отсутствующее значение в столбце кода не может быть вставлено автоматически, поскольку автоматическое приращение отключено.
Следует отметить, что нумерация будет продолжена со значения 16, если значение 15 будет максимальным в столбце кода. Понятно, если автоинкремент будет включен:
УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc OFF;
Наконец, рассмотрим пример добавления данных из таблицы Product в таблицу Product_Inc с сохранением значений в столбце code:
УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;
INSERT INTO Printer_Inc (код, модель, цвет, тип, цена)
ВЫБРАТЬ * ИЗ принтера;
Об автоинкрементируемых столбцах следует сказать следующее.Пусть последнее значение в столбце кода равно 16. Затем строка с этим значением удаляется. Какое значение будет тогда в этом столбце после добавления новой строки? Правильно, 17, т.е. последнее значение счетчика сохраняется, несмотря на удаление строки со значением 16. Таким образом, после удаления и добавления строк нумерация не будет последовательной. Это еще одна причина для вставки строки с заданным (пропущенным) значением в автоинкрементируемый столбец.
ИЗМЕНЕНИЕ ТАБЛИЦЫ
alter-table-stmt:
скрыть
SQLite поддерживает ограниченное подмножество ALTER TABLE.Команда ALTER TABLE в SQLite позволяет пользователю переименовать таблицу,
для переименования столбца в таблице или для добавления нового столбца в существующую таблицу.
Синтаксис RENAME TO изменяет имя таблицы.
на новое-имя-таблицы.
Эта команда
нельзя использовать для перемещения таблицы между присоединенными базами данных, только для переименования
таблица в той же базе данных.
Если переименовываемая таблица имеет триггеры или индексы, они остаются
прикрепляется к таблице после ее переименования.
Примечание о совместимости:
Улучшено поведение ALTER TABLE при переименовании таблицы.
в версиях 3.25.0 (15.09.2018) и 3.26.0 (01.12.2018)
чтобы перенести операцию переименования в триггеры и
представления, которые ссылаются на переименованную таблицу. Это считается
улучшение. Приложения, зависящие от более старых (и
возможно, ошибочно) может использовать
PRAGMA legacy_alter_table = оператор ON или
Параметр конфигурации SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
в интерфейсе sqlite3_db_config (), чтобы сделать ALTER TABLE RENAME
вести себя так же, как и до версии 3.25.0.
Начиная с выпуска 3.25.0 (2018-09-15), ссылки на таблицу
внутри триггерных тел и определений представлений также переименовываются.
До версии 3.26.0 (2018-12-01), ссылки FOREIGN KEY
в переименованную таблицу редактировались только в том случае, если
PRAGMA foreign_keys = ON, или другими словами, если
ограничения внешнего ключа выполнялись. С участием
PRAGMA foreign_keys = OFF, ограничения FOREIGN KEY не будут изменены
когда таблица, на которую ссылается внешний ключ («родительская таблица»)
был переименован. Начиная с версии 3.26.0, ограничения FOREIGN KEY
всегда преобразуются при переименовании таблицы, если только
PRAGMA legacy_alter_table = включена настройка ON. Продолжение
таблица суммирует разницу:
PRAGMA foreign_keys PRAGMA legacy_alter_table Родительский стол
ссылки обновленыВерсия SQLite Выкл. Выкл. Нет <3.26.0 Выкл. Выкл. Да > = 3.26,0 Вкл. Выкл. Да все Выкл. Вкл. Нет все на на да все
Синтаксис RENAME COLUMN TO изменяет
имя-столбца таблицы имя-таблицы
в имя нового столбца. Имя столбца изменено как
внутри самого определения таблицы, а также во всех индексах, триггерах,
и представления, которые ссылаются на столбец.Если изменение имени столбца приведет к
приведет к семантической неоднозначности в триггере или представлении, тогда RENAME
COLUMN завершается с ошибкой, и никакие изменения не применяются.
Синтаксис ADD COLUMN
используется для добавления нового столбца в существующую таблицу.
Новый столбец всегда добавляется в конец списка существующих столбцов.
Правило определения столбца определяет характеристики нового столбца.
Новый столбец может принимать любую из форм, допустимых в CREATE TABLE.
заявление со следующими ограничениями:
- Столбец может не иметь ограничения PRIMARY KEY или UNIQUE.
- Столбец может не иметь значения по умолчанию CURRENT_TIME, CURRENT_DATE,
CURRENT_TIMESTAMP или выражение в скобках. - Если указано ограничение NOT NULL, столбец должен иметь
значение по умолчанию, отличное от NULL. - Если ограничения внешнего ключа включены и
столбец с предложением REFERENCES
добавлен, столбец должен иметь значение по умолчанию NULL. - Столбец не может СОЗДАТЬ ВСЕГДА … СОХРАНИТЬ,
хотя ВИРТУАЛЬНЫЕ столбцы разрешены.
Обратите внимание, что при добавлении ограничения CHECK ограничение CHECK
не проверяется на уже существующих строках таблицы.
В результате может получиться таблица, содержащая данные,
нарушает ограничение CHECK. Будущие версии SQLite могут
измените, чтобы проверить ограничения CHECK по мере их добавления.
Команда ALTER TABLE работает путем изменения текста SQL схемы.
хранится в таблице sqlite_schema.
Никаких изменений в содержимое таблицы не вносится.
Из-за этого,
время выполнения команды ALTER TABLE не зависит от
количество данных в таблице.Команда ALTER TABLE выполняется так же быстро
в таблице с 10 миллионами строк, как в таблице с одной строкой.
После того, как ADD COLUMN был запущен в базе данных, эта база данных не будет
может быть прочитан SQLite версии 3.1.3 (2005-02-20) и ранее.
Единственными командами изменения схемы, напрямую поддерживаемыми SQLite, являются
команды «переименовать таблицу», «переименовать столбец» и «добавить столбец» показаны выше.
Однако приложения
может вносить другие произвольные изменения в формат таблицы, используя простой
последовательность операций.Шаги по внесению произвольных изменений в схему некоторой таблицы X
являются следующими:
Если ограничения внешнего ключа включены, отключите их с помощью PRAGMA foreign_keys = OFF.
Начать транзакцию.
Помните формат всех индексов, триггеров и представлений, связанных с таблицей X.
Эта информация понадобится на шаге 8 ниже. Один из способов сделать это
для выполнения следующего запроса:
Выберите тип, sql FROM sqlite_schema, ГДЕ tbl_name = ‘X’.Используйте CREATE TABLE, чтобы создать новую таблицу «new_X», которая находится в желаемом
изменен формат таблицы X. Убедитесь, что имя «new_X» не противоречит
с любым существующим именем таблицы, конечно.Перенести содержимое из X в new_X с помощью оператора
например: INSERT INTO new_X SELECT … FROM X.Отбросьте старую таблицу X: DROP TABLE X.
Измените имя new_X на X, используя: ALTER TABLE new_X RENAME TO X.
Используйте CREATE INDEX, CREATE TRIGGER и CREATE VIEW
для восстановления индексов, триггеров и представлений
связанной с таблицей X. Возможно, использовать старый формат триггеров,
индексы и представления, сохраненные с шага 3 выше в качестве руководства, вносящие изменения
в зависимости от переделки.Если какие-либо представления ссылаются на таблицу X способом, на который влияет
изменение схемы, затем отбросьте эти представления с помощью DROP VIEW и воссоздайте их
с любыми изменениями, необходимыми для приспособления к изменению схемы
используя CREATE VIEW.Если изначально были включены ограничения внешнего ключа
затем запустите PRAGMA foreign_key_check, чтобы убедиться, что схема
изменение не нарушило никаких ограничений внешнего ключа.Зафиксируйте транзакцию, начатую на шаге 2.
Если ограничения внешних ключей были изначально включены, включите их сейчас.
Осторожно:
Обязательно соблюдайте описанную выше процедуру. Коробки ниже
резюмируйте две процедуры для изменения определения таблицы.Сначала
взгляд, кажется, что они оба достигают одного и того же. Тем не менее
процедура справа не всегда работает, особенно с
расширенные возможности переименования таблиц, добавленные версиями 3.25.0 и
3.26.0. В процедуре справа первоначальное переименование
таблица на временное имя может повредить ссылки на эту таблицу в
триггеры, представления и ограничения внешнего ключа. Безопасная процедура на
слева строит пересмотренное определение таблицы, используя новое временное
имя, затем переименовывает таблицу в ее окончательное имя, которое не нарушает
ссылки.
|
|
↑ Правильно | ↑ Неправильно |
---|
12-шаговая обобщенная процедура ALTER TABLE
выше будет работать, даже если
изменение схемы вызывает изменение информации, хранящейся в таблице.Таким образом, описанная выше полная 12-шаговая процедура подходит для удаления столбца,
изменение порядка столбцов, добавление или удаление ограничения UNIQUE
или PRIMARY KEY, добавив ограничения CHECK, FOREIGN KEY или NOT NULL,
или, например, изменить тип данных для столбца. Однако более простой
и более быстрая процедура может дополнительно использоваться для
некоторые изменения, никак не влияющие на содержимое диска.
Следующая более простая процедура подходит для удаления
Ограничения CHECK или FOREIGN KEY или NOT NULL,
или добавление, удаление или изменение значений по умолчанию на
столбец.
Начать транзакцию.
Запустите PRAGMA schema_version, чтобы определить текущую схему
номер версии. Этот номер понадобится для выполнения шага 6 ниже.Активировать редактирование схемы с помощью
PRAGMA Writable_schema = ВКЛ.Запустите оператор UPDATE, чтобы изменить определение таблицы X
в таблице sqlite_schema:
ОБНОВЛЕНИЕ sqlite_schema SET sql = … ГДЕ тип = ‘таблица’ И имя = ‘X’;Внимание! Внесение таких изменений в таблицу sqlite_schema приведет к
сделать базу данных поврежденной и нечитаемой, если изменение содержит
синтаксическая ошибка.Предполагается, что тщательное тестирование ОБНОВЛЕНИЯ
заявление должно быть выполнено в отдельной пустой базе данных перед его использованием в
база данных, содержащая важные данные.Если изменение в таблице X также влияет на другие таблицы или индексы или
триггеры — это представления в схеме, затем запустите операторы UPDATE для изменения
индексы и представления других таблиц тоже. Например, если имя
изменения столбца, все ограничения FOREIGN KEY, триггеры, индексы и
представления, относящиеся к этому столбцу, должны быть изменены.Внимание: Еще раз, внесение изменений в sqlite_schema
таблица, подобная этой, сделает базу данных поврежденной и нечитаемой, если
изменение содержит ошибку. Тщательно протестируйте всю эту процедуру
в отдельной тестовой базе данных перед использованием на
база данных, содержащая важные данные и / или делать резервные копии
важные базы данных перед запуском этой процедуры.Увеличьте номер версии схемы, используя
PRAGMA schema_version = X, где X — один
больше, чем номер версии старой схемы, найденный на шаге 2 выше.Отключить редактирование схемы с помощью
PRAGMA Writable_schema = ВЫКЛ.(Необязательно) Запустите PRAGMA Integrity_check, чтобы убедиться, что
изменения схемы не повредили базу данных.Зафиксируйте транзакцию, начатую на шаге 1 выше.
Если какая-либо будущая версия SQLite добавит новые возможности ALTER TABLE,
эти возможности, скорее всего, будут использовать одну из двух процедур
изложено выше.
Большинство механизмов баз данных SQL хранят схему, уже проанализированную в
различные системные таблицы.На этих механизмах базы данных ALTER TABLE просто
необходимо внести изменения в соответствующие системные таблицы.
SQLite отличается тем, что хранит схему
в таблице sqlite_schema как исходный текст CREATE
операторы, определяющие схему. Следовательно, ALTER TABLE требует
чтобы изменить текст оператора CREATE. Делать
так что это может быть сложно для некоторых «креативных» схем.
Подход SQLite для хранения схемы в виде текста имеет преимущества
для встроенной реляционной базы данных.Во-первых, это означает, что
схема занимает меньше места в файле базы данных. Это важно
поскольку общий шаблон использования SQLite состоит в том, чтобы иметь много мелких,
отдельные файлы базы данных вместо того, чтобы помещать все в один
большой глобальный файл базы данных, что является обычным подходом для клиент / сервер
движки баз данных.
Поскольку схема дублируется в каждом отдельном файле базы данных, она
важно сохранить компактное представление схемы.
Сохранение схемы в виде текста, а не в виде проанализированных таблиц
придать гибкость реализации.Поскольку внутренний разбор
схемы восстанавливается каждый раз при открытии базы данных,
внутреннее представление схемы может измениться от одного релиза
к следующему. Это важно, поскольку иногда новые функции требуют
усовершенствования внутреннего представления схемы. Изменение
представление внутренней схемы было бы намного сложнее, если бы
представление схемы было представлено в файле базы данных. Итак, в других
слов, сохранение схемы в виде текста помогает поддерживать обратную
совместимость и помогает гарантировать, что старые файлы базы данных могут быть
читать и писать более новыми версиями SQLite.
Сохранение схемы в виде текста также делает
Формат файла базы данных SQLite проще определять, документировать и
понять. Это помогает сделать файлы базы данных SQLite
рекомендуемый формат хранения для долгосрочного архивирования данных.
Обратной стороной хранения схемы в тексте является то, что она может
схему сложно изменить. По этой причине ALTER TABLE
поддержка в SQLite традиционно отставала от других SQL
движки баз данных, которые хранят свои схемы в виде проанализированных системных таблиц
которые легче изменить.
SQL ALTER TABLE
ИЗМЕНЕНИЕ ТАБЛИЦЫ
ALTER TABLE еı ĻɾС
SQL ALTER TABLE �
ڱ Уʹ�:
ALTER TABLE имя_таблицы ADD имя_столбца тип данных
ҪɾеУʹ�
ALTER TABLE имя_таблицы DROP COLUMN имя_столбца
עͣ ijЩ ݿ ϵͳ ݿɾ еķʽ (DROP COLUMN column_name)
номер
ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца тип данных
ԭʼı (е)
Человек:
Id | Фамилия | Имя | Адрес | Город |
---|---|---|---|---|
1 | Адамс | Иоанна | Оксфорд-стрит, | Лондон |
2 | Втулка | Георгий | Пятая авеню | Нью-Йорк |
3 | Картер | Томас | Чанган улица (индекс | Пекин |
SQL ALTER TABLE ʵ
ڣ ϣ ڱ «Персоны» һΪ «День рождения» С
SQL
ALTER TABLE Лица ДОБАВИТЬ дату рождения
ע ⣬ «День рождения» Դ ڡ 涨 п Դ ŵ ݵ͡
мк «Лица»
Id | Фамилия | Имя | Адрес | Город | День рождения |
---|---|---|---|---|---|
1 | Адамс | Иоанна | Оксфорд-стрит, | Лондон | |
2 | Втулка | Джордж | Пятая авеню | Нью-Йорк | |
3 | Картер | Томас | Чанган улица (индекс | Пекин |
№
ı «Персоны» «День рождения» е͡
SQL
ALTER TABLE Лица ALTER COLUMN Год рождения
ע ⣬ «День рождения» е год Դ 2 λ 4 λʽ ݡ
КАПЕЛЬНАЯ КОЛОНКА ʵ
ɾ «Персона» е «День рождения» У
ALTER TABLE Человек КАПЕЛЬНАЯ КОЛОННА День рождения
Людей 9:
Id | Фамилия | Имя | Адрес | Город |
---|---|---|---|---|
1 | Адамс | Иоанна | Оксфорд-стрит, | Лондон |
2 | Втулка | Георгий | Пятая авеню | Нью-Йорк |
3 | Картер | Томас | Чанган улица (индекс | Пекин |
.