loading..
Русский    English
13:42
листать

Оператор DELETE стр. 2

Оператор TRUNCATE TABLE

Как отмечалось выше, при выполнении этой команды значение счетчика (IDENTITY) сбрасывается в начальное значение. Давайте проверим это утверждение в MS SQL Server. Для начала создадим таблицу с автоинкрементируемым столбцом, и добавим в нее три строки.

  1. CREATE TABLE Truncate_test (id INT IDENTITY(5,5) PRIMARY KEY, val INT);
  2. GO
  3. INSERT INTO Truncate_test(val)
  4. VALUES (1),(2),(3);
  5. SELECT * FROM Truncate_test;
  6. GO

Начальным значением счетчика является 5, приращение счетчика выполняется также с шагом 5.
В результате получим:

id   val
5    1
10    2
15    3

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

  1. DELETE FROM Truncate_test;
  2. GO
  3. INSERT INTO Truncate_test(val)
  4. VALUES (1), (2), (3);
  5. SELECT * FROM Truncate_test;
  6. GO

id   val
20   1
25    2
30    3

Как видно из результата, состояние счетчика не было сброшено, и приращение продолжилось с последнего значения (15), в отличие от использования оператора TRUNCATE TABLE: 

  1. TRUNCATE TABLE Truncate_test;
  2. GO
  3. INSERT INTO Truncate_test(val)
  4. VALUES (1),(2),(3);
  5. SELECT * FROM Truncate_test;
  6. GO

id   val
5    1
10   2
15    3

В то же время Стандарт предполагает несколько иное поведение. Стандартный синтаксис имеет вид

  1. TRUNCATE TABLE < имя таблицы > [{CONTINUE IDENTITY} | {RESTART IDENTITY}]
т.е. значение счетчика может быть сброшено (опция RESTART IDENTITY) или продолжено (опция CONTINUE IDENTITY). И, кстати, значением по умолчанию является как раз CONTINUE IDENTITY, что эквивалентно поведению при использованию оператора DELETE (без предложения WHERE).

Оператор TRUNCATE TABLE неприменим, если на таблицу имеется ссылка по внешнему ключу. Это стандартное поведение имеет место в SQL Server. Если создать, например, такую ссылающуюся таблицу, которая даже не будет содержать данных

  1. CREATE TABLE Trun_Ref(id INT REFERENCES Truncate_test);
оператор TRUNCATE TABLE приведет к следующей ошибке:

Cannot truncate table 'Truncate_test' because it is being referenced by a FOREIGN KEY constraint.

(Невозможно усечь таблицу 'Truncate_test', поскольку на нее ссылается ограничение FOREIGN KEY) .

Теперь проверим, насколько близки к стандарту другие реализации.


Bookmark and Share
Страницы: 1 2 3
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/ADVCRUB-SBRFRUB/ . Основные неисправности сварочных инверторов
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.