Как сделать id в sql
Перейти к содержимому

Как сделать id в sql

  • автор:

SQL-Ex blog

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

Что такое столбец identity в SQL Server?

Столбец identity — это числовой столбец в таблице, который автоматически получает целое значение, когда вставляется строка. Столбцы identity часто определяются как integer, но они также могут быть объявлены как bigint, smallint, tinyint, или numeric и decimal, если задан масштаб 0. Столбец identity также не может шифроваться с помощью симметричного ключа, но может с помощью прозрачного шифрования данных (Transparent Data Encryption — TDE). Кроме того, определения столбцов identity не должно допускать значений NULL. Одним из недостатков при использовании столбца identity является то, что в таблице может быть только один столбец identity. Если более одного числового поля в таблице должны заполняться автоматически, обратите внимание на объект sequence (последовательность), который в данной статье рассматриваться не будет.

Значения автоматически генерируются для каждой вставляемой строки на основе свойства seed (начальное значение) и increment (приращение) столбца identity. При определении столбца identity используется следующий синтаксис:

IDENTITY [ (seed , increment) ]
Seed — это первое значение, загружаемое в таблицу, а increment добавляется к предыдущему значению identity, создавая следующее значение последовательности. Должны быть указаны оба значения seed и increment , если вы хотите изменить значения, принимаемые по умолчанию. Если эти значения не указываются, принимаются значения по умолчанию, равные 1.

Определение столбца identity в операторе CREATE TABLE

При проектировании таблицы большинство архитекторов данных создают макет, поэтому первым столбцом в таблице является столбец identity. На самом деле это только стандартная практика, а не требование к столбцу identity. Любой столбец в таблице может быть столбцом identity, но такой столбец может быть в таблице только один. В скрипте 1 создается новая таблица с именем Widget, которая содержит столбец identity.

Скрипт 1: Создание таблицы со столбцом identity

CREATE TABLE Widget 
(
WidgetID int identity(1,1) not null,
WidgetName varchar(100) not null,
WidgetDesc varchar(200) not null
);

WidgetID является столбцом identity, с начальным значением 1 и приращением 1.

Начальное значение определяет значение identity для первой строки, вставляемой в таблицу. Значение приращения используется для определения значения identity для последующих строк, вставляемых в таблицу. Для каждой строки, вставляемой после первой строки, значение приращения добавляется к текущему значению identity для определения значения identity новой добавляемой строки. Текущим значением является целое значение столбца identity последней вставленной строки в таблицу. Чтобы посмотреть как это работает, выполните скрипт 2.

Скрипт2: Код вставки и вывода трех строк, добавленных в таблицу Widget

INSERT INTO Widget VALUES 
('thingamajig','A jig you cannot remember'),
('doodad','A hair style you cannot remember'),
('whatchamacallit', 'A thing for which you cannot remember');
SELECT * FROM Widget;

При выполнении скрипта 2 будет получен следующий вывод:

В скрипте 2 во вновь созданную таблицу вставляются три строки. Скрипт предоставляет значения только для столбцов WidgetName и WidgetDesc, но не для столбца WidgetID. Значение для столбца WidgetID для первой вставленной строки определяется значением seed в операторе CREATE TABLE, который приведен в скрипте 1. Значение 2 столбца WidgetID для строки с WidgetName doodad было получено добавлением приращения 1 к последнему вставленному значению identity. Значение 3 столбца WidgetID для строки с WidgetName whatchamacallit получило свое значение добавлением 1 к значению identity, использованному для второй вставленной строки.

Помните, что начальное значение и приращение не обязаны быть равными по 1; они могут быть любыми подходящими для таблицы значениями. Например, таблица может использовать начальное значение 1000 и приращение 10, как я сделал для столбца WidgetID.

Скрипт 3: Использование различных значений seed и increment

CREATE TABLE DifferentSeedIncrement 
(
ID int identity(1000,10),
A varchar(100),
B varchar(200)
);

Столбец ID в скрипте 3 не имеет определения свойства NOT NULL в операторе CREATE TABLE, как я делал это для столбца identity в скрипте 1. Требование not null для столбца можно опустить, поскольку за сценой ядро базы данных автоматически добавляет свойство NOT NULL для любого столбца identity при его создании.

Я оставляю вам выполнение кода в скрипте 3 и вставку нескольких строк в таблицу DifferentSeedIncrement. Тогда вы сами сможете увидеть генерацию значений ID для каждой новой строки, вставляемой в таблицу DifferentSeedIncrement, и как таблица определена для SQL Server.

Уникальность столбца identity

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

Идентификация столбцов и их определений в базе данных

Существует много способов идентифицировать столбцы identity и их определения в базе данных. Один из них — использовать браузер объектов SQL Server, хотя столбец identity не может быть обнаружен в простом отображении столбцов в таблице, как показано на рис.1.

Рис.1: Отображение определений столбцов для таблиц, созданных скриптами 1 и 3

Для выяснения того, какой столбец действительно является столбцом identity, необходимо посмотреть свойства столбца. Для этого выполните щелчок правой кнопкой на Object Explorer, а затем на пункте Properties в выпадающем контекстном меню. На рис.2 показаны свойства столбца WidgetID в таблице Widget.

Рис.2: Свойства столбца dbo.Widget.WidgetId

Если свойство Identity имеет значение True, то этот столбец является столбцом Identity. Также показаны начальное значение и приращение.

Использование свойств браузера объектов для идентификации столбцов Identity в базе данных с множеством таблиц может потребовать времени. Другим методом для вывода всех столбцов Identity в базе данных является использование представления sys.identity_column, как показано в коде T-SQL скрипта 4.

Скрипт 4: Вывод всех значений Identity в базе данных

SELECT 
OBJECT_SCHEMA_NAME(tables.object_id, db_id())
AS SchemaName,
tables.name As TableName,
identity_columns.name as ColumnName,
identity_columns.seed_value,
identity_columns.increment_value,
identity_columns.last_value
FROM sys.tables tables
JOIN sys.identity_columns identity_columns
ON tables.object_id=identity_columns.object_id
GO

Скрипт 4 возвращает такой результат:

Обратите внимание, что столбец last_value для значения DifferentSeedIncrement столбца TableName имеет значение NULL. Это означает, что никаких строк не было вставлено в эту таблицу, поэтому LastValue (последнее значение) не имеет значения.

Добавление столбца identity в существующую таблицу

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

Скрипт 5: Добавление столбца identity

CREATE TABLE Invoices 
(
InvoiceDate date,
InvoiceNumber varchar(100),
PayTo varchar (100)
);
INSERT INTO Invoices VALUES
(getdate(), 'GL_0001', 'Greg Larsen'),
(getdate(), 'GL_0002', 'Greg Larsen');
-- Добавить столбец Identity
ALTER TABLE Invoices
ADD InvoiceID int identity;
-- Просмотр строк
SELECT * FROM Invoices;

Результат выполнения скрипта:

На рисунке видно, что добавлен новый столбец InvoiceID, это столбец был автоматически заполнен значениями identity для всех существующих строк.

Изменение существующей таблицы для определения столбца identity

Как уже говорилось, SQL Server не позволяет использовать команду ALTER TABLE/ALTER COLUMN для непосредственного преобразования существующего столбца в столбец identity. Однако есть вариант модификации существующего столбца таблицы, чтобы он стал столбцом identity. Следующий пример демонстрирует вариант, который использует рабочую таблицу для изменения столбца в существующей таблице на столбец identity.

Чтобы выполнить модификацию существующего столбца в столбец identity, скрипт использует команду ALTER TABLE … SWITCH. Опция SWITCH была добавлена в оператор ALTER TABLE в SQL Server 2005 как часть функции секционирования. Код T-SQL в скрипте 6 использует временную таблицу и опцию SWITCH для поддержки преобразования существующего столбца в столбец identity.

Скрипт 6: Преобразование существующего столбца в столбец identity

DROP TABLE Invoices -- очищаем от предыдущего примера 
GO
-- Шаг 1: Создание таблицы Invoices и наполнение её данными
CREATE TABLE Invoices
(
InvoiceID int NOT NULL,
InvoiceDate date,
InvoiceNumber varchar(100),
PayTo varchar (100)
);
INSERT INTO Invoices VALUES
(1, getdate(), 'GL_0001', 'Greg Larsen'),
(2, getdate(), 'GL_0003', 'Greg Larsen');
-- Шаг 2: создание временной рабочей таблицы с той же схемой, но имеющей столбец identity
CREATE TABLE Invoices2
(
InvoiceID int identity(1,1),
InvoiceDate date,
InvoiceNumber varchar(100),
PayTo varchar (100)
);
-- Шаг 3: Переключение таблиц, удаление исходной и переименование
ALTER TABLE Invoices SWITCH TO Invoices2;
-- удаление исходной таблицы
DROP TABLE Invoices;
-- Переименование временной таблицы в имя исходной таблицы
EXEC sp_rename 'Invoices2','Invoices';
-- Шаг 4: Обновление текущего значения seed для новой таблицы Invoices
DBCC CHECKIDENT('Invoices');

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

Чтобы использовать опцию SWITCH в операторе ALTER TABLE, столбец в исходной таблице, изменяемый на столбец identity, не должен допускать NULL-значений. Если он допускает NULL, то операции switch будут неудачны.

Не забудьте сбросить начальное значение столбца identity новой таблицы с помощью команды DBCC CHECKIDENT. Если этого не сделать, то следующая вставленная строка будет использовать исходной значение seed, и могут возникать дубликаты значений identity, если столбец не является первичным ключом или не имеет ограничения уникальности, или уникального индекса на столбце identity.

Перед запуском команды ALTER TABLE… SWITCH необходимо удалить все внешние ключи.

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

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

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

Повторное заполнение столбца identity

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

Для повторного заполнения значений identity в таблице используется команда DBCC CHECKIDENT. Эта команда имеет следующий синтаксис:

DBCC CHECKIDENT 
(
имя_таблицы
[, < NORESEED | < RESEED [, новое_значение_seed ] >> ]
)
[ WITH NO_INFOMSGS ]

Параметр имя_таблицы — это имя таблицы, которая содержит спецификацию identity. Таблица должна содержать столбец identity, в противном случае при выполнении команды DBCC CHECKINDENT возникает ошибка. Если никакие опции не указаны в этой команде, текущее значение identity будет сброшено к максимальному существующему значению в столбце identity.

Опция NORESEED предписывает не изменять начальное значение (seed). Эта опция полезна для определения текущего и максимального значения identity. Если текущее и максимальное значения различны, то значение identity должно быть повторно заполнено.

Когда текущее значение identity меньше максимального, или существует большой зазор в значениях identity, для сброса текущего значения identity может использоваться опция RESEED. Опция RESEED может быть указана с новое_значение_seed или без него. Если новое_значение_seed не указано, текущее значение identity будет установлено в максимальное значение, записанное в столбце identity указанной таблицы.

Скрипт 6 показывает, как повторно заполнить значение столбца identity с помощью команды DBCC CHECKINDENT без использования опции RESEED. В скрипте 7 показан код T-SQL, который устанавливает текущее значение seed в 2 используя опцию RESEED.

Скрипт 7: Использование опции RESEED

DBCC CHECKIDENT('Invoices',RESEED,2);

Будьте осторожны с использованием опции RESEED с новым значением seed. SQL Server не заботится о том, какое значение используется для нового начального значения. Если новое значение установлено в значение, которое меньше максимального значения seed в таблице, могут возникнуть дублирующиеся значения identity.

Столбец identity в SQL Server

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

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

CREATE TABLE (Transact-SQL) IDENTITY (Свойство)

Создает в таблице столбец идентификаторов. Это свойство указывается в инструкциях языка Transact-SQL CREATE TABLE и ALTER TABLE.

Свойство IDENTITY отличается от свойства SQL-DMO Identity , которое предоставляет свойство удостоверения строки столбца.

Синтаксис

IDENTITY [ (seed , increment) ] 

Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

seed

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

increment

Добавочное значение, добавляемое к значению удостоверения предыдущей строки, загруженной.

В Azure Synapse Analytics значения для удостоверений не являются добавочными из-за распределенной архитектуры хранилища данных. Дополнительные сведения см. в статье «Использование IDENTITY» для создания суррогатных ключей в пуле SQL Synapse.

Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни одного из них. Если ничего не указано, применяется значение по умолчанию (1,1).

Замечания

Столбцы идентификаторов можно использовать для формирования значений ключей. Свойство identity в столбце гарантирует следующие условия:

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

Свойство identity в столбце не гарантирует следующие условия:

    Уникальность значения — уникальность должна быть применена с помощью PRIMARY KEY UNIQUE или ограничения или UNIQUE индекса.

Примечание. Azure Synapse Analytics не поддерживает PRIMARY KEY или ограничивает или UNIQUE UNIQUE индекс. Дополнительные сведения см. в статье «Использование IDENTITY» для создания суррогатных ключей в пуле SQL Synapse.

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

Если таблица со столбцом идентификаторов опубликована для репликации, этот столбец должен обслуживаться в соответствии с типом репликации. Дополнительные сведения см. в статье Репликация столбцов идентификаторов.

Для каждой таблицы можно создать только один столбец идентификаторов.

В таблицах, оптимизированных для памяти, начальное и добавочное значение должны быть заданы 1, 1 . Задание начального или добавочного значения, отличного 1 от следующей ошибки: The use of seed and increment values other than 1 is not supported with memory optimized tables

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

Примеры

А. Использование свойства IDENTITY с CREATE TABLE

В следующем примере производится создание новой таблицы со свойством IDENTITY для получения автоматически увеличивающегося идентификационного номера.

USE AdventureWorks2022; GO IF OBJECT_ID('dbo.new_employees', 'U') IS NOT NULL DROP TABLE new_employees; GO CREATE TABLE new_employees ( id_num INT IDENTITY(1, 1), fname VARCHAR(20), minit CHAR(1), lname VARCHAR(30) ); INSERT new_employees (fname, minit, lname) VALUES ('Karin', 'F', 'Josephs'); INSERT new_employees (fname, minit, lname) VALUES ('Pirkko', 'O', 'Koskitalo'); 

B. Использование универсального синтаксиса для поиска пробелов в значениях удостоверений

Следующий пример демонстрирует базовый синтаксис для поиска разрывов в нумерации идентификаторов, возникающих при удалении данных.

Первая часть данного скрипта Transact-SQL приведена только в учебных целях. Вы можете запустить скрипт Transact-SQL, который начинается с комментария: — Create the img table .

-- Here is the generic syntax for finding identity value gaps in data. -- The illustrative example starts here. SET IDENTITY_INSERT tablename ON; DECLARE @minidentval column_type; DECLARE @maxidentval column_type; DECLARE @nextidentval column_type; SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY) FROM tablename IF @minidentval = IDENT_SEED('tablename') SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename') FROM tablename t1 WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND @maxidentval AND NOT EXISTS ( SELECT * FROM tablename t2 WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('tablename') ) ELSE SELECT @nextidentval = IDENT_SEED('tablename'); SET IDENTITY_INSERT tablename OFF; -- Here is an example to find gaps in the actual data. -- The table is called img and has two columns: the first column -- called id_num, which is an increasing identification number, and the -- second column called company_name. -- This is the end of the illustration example. -- Create the img table. -- If the img table already exists, drop it. -- Create the img table. IF OBJECT_ID('dbo.img', 'U') IS NOT NULL DROP TABLE img; GO CREATE TABLE img ( id_num INT IDENTITY(1, 1), company_name SYSNAME ); INSERT img (company_name) VALUES ('New Moon Books'); INSERT img (company_name) VALUES ('Lucerne Publishing'); -- SET IDENTITY_INSERT ON and use in img table. SET IDENTITY_INSERT img ON; DECLARE @minidentval SMALLINT; DECLARE @nextidentval SMALLINT; SELECT @minidentval = MIN($IDENTITY) FROM img IF @minidentval = IDENT_SEED('img') SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img') FROM img t1 WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND NOT EXISTS ( SELECT * FROM img t2 WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img') ) ELSE SELECT @nextidentval = IDENT_SEED('img'); SET IDENTITY_INSERT img OFF; 

Связанный контент

  • Инструкция ALTER TABLE (Transact-SQL)
  • CREATE TABLE (Transact-SQL)
  • DBCC CHECKIDENT (Transact-SQL)
  • IDENT_INCR (Transact-SQL)
  • @@IDENTITY (Transact-SQL)
  • IDENTITY (Function) (Transact-SQL)
  • IDENT_SEED (Transact-SQL)
  • SELECT (Transact-SQL)
  • SET IDENTITY_INSERT (Transact-SQL)
  • Репликация столбцов идентификаторов

Обратная связь

Были ли сведения на этой странице полезными?

Как сделать чтобы id заполнялось автоматически sql

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

Например, в MySQL вы можете использовать тип данных INT или BIGINT для столбца и добавить опцию AUTO_INCREMENT для автоматического заполнения идентификатора. Например:

CREATE TABLE mytable ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(50), column2 VARCHAR(50) ); 

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

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

CREATE SEQUENCE mytable_id_seq; 

Затем вы можете использовать эту последовательность для заполнения значения столбца id в таблице:

CREATE TABLE mytable ( id INTEGER DEFAULT nextval('mytable_id_seq') PRIMARY KEY, column1 VARCHAR(50), column2 VARCHAR(50) ); 

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

Создание id в существующей таблице

Есть база на sql server 2008, в ней есть таблицы с записями но без id. Хотелось бы добавить id со значениями 1,2,3,4. Помогите пожалуйста написать этот запрос.

Добавлено через 17 минут

ЦитатаСообщение от jfr Посмотреть сообщение

Есть база на sql server 2008, в ней есть таблицы с записями но без id. Хотелось бы добавить id со значениями 1,2,3,4. Помогите пожалуйста написать этот запрос.

сначало хотелось бы отсортировать по фамилии и потом добавить id
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Создание поля в существующей таблице и заполнение его данными
Дамы и господа, такой вопрос: Есть две таблицы, к примеру, табл1 Владельцы животных — информация.

Создание нового поля в существующей таблице
Здравствуйте. Пишу на PHP класс пользовательского кабинета. За регистрацию отвечает он же.

Создание записей в таблице на основе данных уже существующей таблицы
Добрый день! Данные вводимые в базу можно условно разделить на 2 части: Основные.

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

134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221

1 2 3 4 5 6 7 8
CREATE TABLE t_table( name_user VARCHAR(50) ); INSERT INTO t_table(name_user) VALUES('Чистяков') INSERT INTO t_table(name_user) VALUES('Тимачев') INSERT INTO t_table(name_user) VALUES('Борисюк') INSERT INTO t_table(name_user) VALUES('Васильев')

Сортируем строки в таблице:

CREATE CLUSTERED INDEX idx_table_user ON dbo.t_table_user(NameUser)

Добавляем автоинкрементный id:

ALTER TABLE t_table_user ADD id INT IDENTITY NOT NULL PRIMARY KEY

Или, если PRIMARY KEY в таблице уже есть:

ALTER TABLE t_table_user ADD id INT IDENTITY NOT NULL

1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264

ЦитатаСообщение от devart dbforge Посмотреть сообщение

Сортируем строки в таблице:

CREATE CLUSTERED INDEX idx_table_user ON dbo.t_table_user(NameUser)

Записи упорядочиваются только в момент запроса
и только с помощью конструкции ORDER BY
Никак иначе!
134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221

ЦитатаСообщение от iap Посмотреть сообщение

Записи упорядочиваются только в момент запроса
и только с помощью конструкции ORDER BY
Никак иначе!
1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264

ЦитатаСообщение от devart dbforge Посмотреть сообщение

134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221
Кластерный индекс физически упорядочивает строки в таблице.
Из приведенной мной ссылки:

Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице.

В приведенном мной скрипте выполните запрос

SELECT * FROM t_table

до создания кластерного индекса и после.
Сравните результаты.
1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264

ЦитатаСообщение от devart dbforge Посмотреть сообщение

Кластерный индекс физически упорядочивает строки в таблице.
Из приведенной мной ссылки:

В приведенном мной скрипте выполните запрос

SELECT * FROM t_table

до создания кластерного индекса и после.
Сравните результаты.

Не буду. Это всё равно ничего не доказывает.
Порядок строк в таблице логически никак не связан с порядком строк в результате запроса.

134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221

ЦитатаСообщение от iap Посмотреть сообщение

Не буду. Это всё равно ничего не доказывает.

Создает индекс, в котором логический порядок значений ключа определяет физический порядок соответствующих строк в таблице.

Creates an index in which the logical order of the key values determines the physical order of the corresponding rows in a table.

Источник один и тот же — MSDN.
1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264

ЦитатаСообщение от devart dbforge Посмотреть сообщение

Источник один и тот же — MSDN.

Есть разница между физическим порядком хранения в таблице
и порядком в результате запроса? А?
Всё зависит от плана выполнения запроса.
Сервер не обязан выдавать записи в том же порядке, в котором они хранятся.
И индексов может быть много.

134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221

ЦитатаСообщение от iap Посмотреть сообщение

Есть разница между физическим порядком хранения в таблице
и порядком в результате запроса?

В данном, конкретном, случае разницы не было.

Вы собираетесь и дальше утверждать, что кластерный индекс не сортирует физически данные в таблице?

176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430

devart dbforge, все правильно написал вначале.
Это потом допустил оплошность с выборкой. Ну так она никакого отношения к вопросу jfr не имеет.
Так что заканчивает бузить iap.

168 / 142 / 1
Регистрация: 01.04.2010
Сообщений: 474

вставлю свои 5 копеек.
если таблица с более 10 млн. записей (весом более 500Мб) обработана кластерным методом, то запросы которые используют данную таблицу в разы быстрее исполняются по сравнению с тем, если бы эта табл. не была бы кластеризированна.

1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264

ЦитатаСообщение от devart dbforge Посмотреть сообщение

В данном, конкретном, случае разницы не было.

Если код работает в каком-то конкретном случае, но нет гарантии, что он будет работать правильно всегда,
то этот код обычно называют «говнокодом». Это неприятно и свидетельствует о недостаточной профессиональной подготовке автора кода.

ЦитатаСообщение от devart dbforge Посмотреть сообщение

Вы собираетесь и дальше утверждать, что кластерный индекс не сортирует физически данные в таблице?

Я и раньше этого не утверждал.
Я утверждаю, что это никак не должно интересовать с практической точки зрения автора SQL запроса.
Для документированной гарантии порядка записей в результате запроса должен быть
явно задан
ORDER BY

134 / 119 / 0
Регистрация: 30.06.2010
Сообщений: 221

ЦитатаСообщение от iap Посмотреть сообщение

Если код работает в каком-то конкретном случае, но нет гарантии, что он будет работать правильно всегда,то этот код обычно называют «говнокодом».

Расскажите это Исааку Ньютону: ведь его механика не работает на скоростях близких к скорости света.

ЦитатаСообщение от iap Посмотреть сообщение

Я и раньше этого не утверждал.

Ой ли? Не Вашу ли фразу я привел ниже? И наверное не только я вижу в ней
два слова «только» и слово сочетание «Никак иначе»?

ЦитатаСообщение от iap Посмотреть сообщение

Записи упорядочиваются только в момент запроса
и только с помощью конструкции ORDER BY
Никак иначе!

ЦитатаСообщение от iap Посмотреть сообщение

Я утверждаю, что это никак не должно интересовать с практической точки зрения автора SQL запроса.

Ну так выполните приведенный мной скрипт один раз с созданием кластерного индекса, другой раз без и посмотрите результаты простого SELECT по таблице. Когда увидите четыре отличия, поймете ПОЧЕМУ ТС просил строки СНАЧАЛА отсортировать.

1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264
Ну-ну. Продолжайте в том же духе. Не смею больше Вам мешать.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Добавление индекса к уже существующей таблице с данными
Добрый )) Есть таблица с уже 300 000 строк. Индексы отсутствуют и простой select запрос.

В существующей таблице создать поле и присвоить тип
Здравствуйте! ,Совсем не знаю можно ли сделать нечто подобное при работе в AccessRunTime (для себя.

Как php прочитать файл в массив и в существующей таблице поменять NAME в соответствии с ID из
Добрый день! Задача есть csv файл следующего содержания: ID;NAME 54573;Lieskau.

Создание temp таблицы из существующей
Добрый день. Требуется создать TEMP таблицу и перелить данные из существующей. (для изменения в.

Создание таблиц в существующей базе?
Как создать таблицу в существующей базе данных во время работы прилдожения?

Создание новой таблицы из полей существующей
Собственно, вопрос полностью изложен в заголковке, как используя myadmin создать новую талицу из.

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

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