Разное

Добавить столбец в таблицу sql: Как добавить новый столбец в таблицу на SQL? | Info-Comp.ru

Содержание

Как добавить новый столбец в таблицу на SQL? | Info-Comp.ru

Продолжаем изучать SQL и сегодня мы поговорим о том, как можно добавить новую колонку в уже существующую таблицу с данными. И как обычно рассмотрим примеры реализации этого в разных СУБД.

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

Заметка! Профессиональный видеокурс по T-SQL для начинающих.

Добавляем колонку в таблицу в PostgreSQL

Сначала начнем разбирать пример на СУБД PostgreSQL. Допустим, у нас есть таблица «users» и в ней уже есть данные:

idNameFam
1User1Fam1
2User2Fam2
3User3Fam3

Другими словами у нас в таблице имеется:

  • 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:



Курс по SQL для начинающих

   
   UPDATE work.users SET Otch = 'Otch2'
   WHERE name = 'User1'


После этого можете проверить данные, выполнив запрос на выборку с помощью нам уже известного оператора SELECT:

   
   SELECT * FROM work.users
   WHERE name = 'User1'


Вы получите следующий результат:

idNameFamOtch
1User1Fam1Otch2

Добавляем новую колонку в таблицу в 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-запросов. Это запросы на добавление и удаление записей из таблицы базы данных. Поскольку, ОЧЕНЬ часто приходится добавлять новые записи в таблицу, причём делать это в автоматическом режиме, то данный материал обязателен к изучению.

Для начала 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.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):


  1. Кнопка:

    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так: Как создать свой сайт


  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. 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 .

Sample data

Sample data

Операция добавления столбца 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 столбца.

Get data about column

Get data about column

Давайте добавим новый столбец «Отдел» с помощью следующей команды Alter Table .

ИЗМЕНИТЬ ТАБЛИЦУ Сотрудник

ДОБАВИТЬ Отдел Варчар (50)

Выполните этот запрос и выберите записи из таблицы Employee.На следующем снимке экрана мы видим новую колонку Department. Все существующие записи содержат в этом столбце значение NULL.

SQL Add Column

SQL Add Column

Ранее мы проверяли все столбцы в таблице 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;

КОНЕЦ;

Error message in adding column Error message in adding column

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’

Table size and other parameters

Table size and other parameters

Ниже указан размер базы данных для данных и файла журнала.

Database file sizes, transaction log file.

Database file sizes, transaction log file.

Давайте быстро рассмотрим синтаксис добавления одного столбца в существующую таблицу с помощью оператора 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 записей.

Посмотрим на размер таблицы.

Table size after adding a column with default constraint using SQL Server ALTER TABLE clause.

Table size after adding a column with default constraint using SQL Server ALTER TABLE clause.

Вы увидите, что ничего не изменилось.

Давайте посмотрим размеры файлов базы данных.

database size and transaction log file after adding a column with default constraint using SQL Server ALTER TABLE Add statement.

database size and transaction log file after adding a column with default constraint using SQL Server ALTER TABLE Add statement.

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

Обновление со значением

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

Тип ресурса

Режим запроса

Количество записей

БАЗА ДАННЫХ

S

1

ОБЪЕКТ

Икс

1

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

Посмотрим на размер стола.

Table size after adding and updating the column,

Table size after adding and updating the column,

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

Ниже приведены сведения о затратах на запросы, полученные с помощью SQL Profiler.

ЦПУ

29 781

Читает

9 188 986

Пишет

527 436

Продолжительность Милл Секунды

1,113,142

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

Ниже приведены размеры файлов базы данных при добавлении столбца и обновлении значений.

database size and transaction log file after adding a column and updating the column.

database size and transaction log file after adding a column and updating the column.

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

В чем разница в этих сценариях? До SQL Server 2012 при добавлении столбца со значением по умолчанию будет такое же поведение. В SQL Server 2012 и более поздних версиях такой ситуации больше нет, столбец добавляется в таблицу в интерактивном режиме, и обновление не происходит, это только изменение метаданных.

Как это достигается

Это достигается довольно простым, но новым подходом. sys.system_internals_partition_columns DMV имеет два дополнительных столбца с именами has_default и default_value , как показано ниже.

sys.system_internals_partition_columns dmv

sys.system_internals_partition_columns dmv

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

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

Заключение

В этой статье мы рассмотрели базовый синтаксис SQL Server ALTER TABLE и реализовали его для добавления столбцов в существующую таблицу.

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

Однако, начиная с SQL Server 2012, подход изменился, поэтому добавление столбца с ограничениями по умолчанию стало намного лучше.

Dinesh Asanka Dinesh Asanka Динеш Асанка является MVP в категории SQL Server за последние 8 лет. Он работает с SQL Server более 15 лет, пишет статьи и является соавтором книг. Он является докладчиком в различных группах пользователей и университетах. Он всегда готов учиться и делиться своими знаниями.

Посмотреть все сообщения от Динеш Асанка

Dinesh Asanka Dinesh Asanka Последние сообщения от Динеш Асанка (посмотреть все)

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.

 
  1. СОЗДАТЬ ТАБЛИЦУ Printer_Inc

  2. (

  3. код int IDENTITY (1,1) PRIMARY KEY,

  4. модель varchar (4) NOT NULL,

  5. 1 NOT NULL цвет char ,

  6. type varchar (6) NOT NULL,

  7. price float NOT NULL

  8. );

Автоинкрементируемый столбец определяется функцией IDENTITY (1, 1), где первый параметр (начальное значение) — это значение, которое должно быть присвоено первой строке в таблице, а второе — приращение, добавляемое к начальному значению для следующих друг за другом строк. в таблице.Итак, в этом примере первая вставленная строка получает в столбце кода значение 1, вторая строка — 2 и так далее.

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

 
  1. INSERT INTO Printer_Inc

  2. ЗНАЧЕНИЯ (15, 3111, 'y', 'laser', 599);

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

 
  1. INSERT INTO Printer_Inc (модель, цвет, тип, цена)

  2. VALUES (3111, 'y', 'laser', 599);

В результате информация о модели 3111 для цветного лазерного принтера стоимостью 2599 долларов будет добавлена ​​в таблицу Printer_Inc. Значение в столбце code 15 случайно. В большинстве случаев конкретное значение в столбце идентификаторов не имеет значения, поскольку это значение, как правило, не имеет смысла; Первый момент — уникальность стоимости.

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

Из-за отсутствия автоматически увеличиваемых столбцов в стандарте SQL не существует единого подхода.Здесь реализация в MS SQL Server. Заявление

 
  1. SET IDENTITY_INSERT TABLE name> {ON | ВЫКЛ};

выключите (значение ON) или включите (значение OFF) использование автоматического увеличения. Таким образом, чтобы добавить строку со значением 15 в столбец кода, мы можем написать

 
  1. УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;

  2. INSERT INTO Printer_Inc (код, модель, цвет, тип, цена)

  3. VALUES (15, 3111, 'y', 'laser', 599);

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

 
  1. УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;

  2. INSERT INTO Printer_Inc

  3. ЗНАЧЕНИЯ (15, 3111, 'y', 'laser', 599);

ни

 
  1. УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;

  2. INSERT INTO Printer_Inc (модель, цвет, тип, цена)

  3. VALUES (3111, 'y', 'laser', 599);

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

Следует отметить, что нумерация будет продолжена со значения 16, если значение 15 будет максимальным в столбце кода. Понятно, если автоинкремент будет включен:

 
  1. УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc OFF;

Наконец, рассмотрим пример добавления данных из таблицы Product в таблицу Product_Inc с сохранением значений в столбце code:

 
  1. УСТАНОВИТЬ IDENTITY_INSERT Printer_Inc ON;

  2. INSERT INTO Printer_Inc (код, модель, цвет, тип, цена)

  3. ВЫБРАТЬ * ИЗ принтера;

Об автоинкрементируемых столбцах следует сказать следующее.Пусть последнее значение в столбце кода равно 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
являются следующими:

  1. Если ограничения внешнего ключа включены, отключите их с помощью PRAGMA foreign_keys = OFF.

  2. Начать транзакцию.

  3. Помните формат всех индексов, триггеров и представлений, связанных с таблицей X.
    Эта информация понадобится на шаге 8 ниже. Один из способов сделать это
    для выполнения следующего запроса:
    Выберите тип, sql FROM sqlite_schema, ГДЕ tbl_name = ‘X’.

  4. Используйте CREATE TABLE, чтобы создать новую таблицу «new_X», которая находится в желаемом
    изменен формат таблицы X. Убедитесь, что имя «new_X» не противоречит
    с любым существующим именем таблицы, конечно.

  5. Перенести содержимое из X в new_X с помощью оператора
    например: INSERT INTO new_X SELECT … FROM X.

  6. Отбросьте старую таблицу X: DROP TABLE X.

  7. Измените имя new_X на X, используя: ALTER TABLE new_X RENAME TO X.

  8. Используйте CREATE INDEX, CREATE TRIGGER и CREATE VIEW
    для восстановления индексов, триггеров и представлений
    связанной с таблицей X. Возможно, использовать старый формат триггеров,
    индексы и представления, сохраненные с шага 3 выше в качестве руководства, вносящие изменения
    в зависимости от переделки.

  9. Если какие-либо представления ссылаются на таблицу X способом, на который влияет
    изменение схемы, затем отбросьте эти представления с помощью DROP VIEW и воссоздайте их
    с любыми изменениями, необходимыми для приспособления к изменению схемы
    используя CREATE VIEW.

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

  11. Зафиксируйте транзакцию, начатую на шаге 2.

  12. Если ограничения внешних ключей были изначально включены, включите их сейчас.

Осторожно:
Обязательно соблюдайте описанную выше процедуру. Коробки ниже
резюмируйте две процедуры для изменения определения таблицы.Сначала
взгляд, кажется, что они оба достигают одного и того же. Тем не менее
процедура справа не всегда работает, особенно с
расширенные возможности переименования таблиц, добавленные версиями 3.25.0 и
3.26.0. В процедуре справа первоначальное переименование
таблица на временное имя может повредить ссылки на эту таблицу в
триггеры, представления и ограничения внешнего ключа. Безопасная процедура на
слева строит пересмотренное определение таблицы, используя новое временное
имя, затем переименовывает таблицу в ее окончательное имя, которое не нарушает
ссылки.

  1. Создать новую таблицу
  2. Копировать данные
  3. Удалить старый стол
  4. Переименовать новое в старое
  1. Переименовать старую таблицу
  2. Создать новую таблицу
  3. Копировать данные
  4. Удалить старый стол

Правильно

Неправильно

12-шаговая обобщенная процедура ALTER TABLE
выше будет работать, даже если
изменение схемы вызывает изменение информации, хранящейся в таблице.Таким образом, описанная выше полная 12-шаговая процедура подходит для удаления столбца,
изменение порядка столбцов, добавление или удаление ограничения UNIQUE
или PRIMARY KEY, добавив ограничения CHECK, FOREIGN KEY или NOT NULL,
или, например, изменить тип данных для столбца. Однако более простой
и более быстрая процедура может дополнительно использоваться для
некоторые изменения, никак не влияющие на содержимое диска.
Следующая более простая процедура подходит для удаления
Ограничения CHECK или FOREIGN KEY или NOT NULL,
или добавление, удаление или изменение значений по умолчанию на
столбец.

  1. Начать транзакцию.

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

  3. Активировать редактирование схемы с помощью
    PRAGMA Writable_schema = ВКЛ.

  4. Запустите оператор UPDATE, чтобы изменить определение таблицы X
    в таблице sqlite_schema:
    ОБНОВЛЕНИЕ sqlite_schema SET sql = … ГДЕ тип = ‘таблица’ И имя = ‘X’;

    Внимание! Внесение таких изменений в таблицу sqlite_schema приведет к
    сделать базу данных поврежденной и нечитаемой, если изменение содержит
    синтаксическая ошибка.Предполагается, что тщательное тестирование ОБНОВЛЕНИЯ
    заявление должно быть выполнено в отдельной пустой базе данных перед его использованием в
    база данных, содержащая важные данные.

  5. Если изменение в таблице X также влияет на другие таблицы или индексы или
    триггеры — это представления в схеме, затем запустите операторы UPDATE для изменения
    индексы и представления других таблиц тоже. Например, если имя
    изменения столбца, все ограничения FOREIGN KEY, триггеры, индексы и
    представления, относящиеся к этому столбцу, должны быть изменены.

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

  6. Увеличьте номер версии схемы, используя
    PRAGMA schema_version = X, где X — один
    больше, чем номер версии старой схемы, найденный на шаге 2 выше.

  7. Отключить редактирование схемы с помощью
    PRAGMA Writable_schema = ВЫКЛ.

  8. (Необязательно) Запустите PRAGMA Integrity_check, чтобы убедиться, что
    изменения схемы не повредили базу данных.

  9. Зафиксируйте транзакцию, начатую на шаге 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 Картер Томас Чанган улица (индекс Пекин

.

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

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