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

У меня есть следующая временная таблица с индексом. Это работает, поскольку я явно называю это IX_#Final_1.

Как создать индекс без явного имени?

CREATE TABLE [#Test1]
(
    [ID] INT IDENTITY(1, 1) PRIMARY KEY,
    [Member_BK] VARCHAR(20),
    [Company] VARCHAR(20),
    [Facility_Name] VARCHAR(200),

    INDEX [IX_#Final_1] ([Member_BK], [Company])
)

Мне это нужно из-за проблем, описанных в dba.stackexchange.com. В базе данных уже есть объект с именем PK_MyPrimaryKey (первичный индекс во временной таблице)

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

Tim Biegeleisen 29.06.2024 01:57

Синтаксис CREATE TABLE поддерживает только неявные имена (каждый индекс получает имя независимо от того, указываете вы его или нет) для ограничений PRIMARY KEY и UNIQUE. Если это уникальный индекс, отбросьте имя и замените INDEX ключевым словом UNIQUE, например: db<>fiddle.

AlwaysLearning 29.06.2024 02:24

«В базе данных уже есть объект с именем PK_TempId» — это создание ограничения. Для индексов нет такого требования, чтобы имя было уникальным в пределах схемы. Он должен быть уникальным только внутри каждой таблицы.

Martin Smith 29.06.2024 03:40

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

Alex 29.06.2024 04:41

Вам это вообще не «нужно», во многом вам не «нужен» молоток, чтобы закрутить шуруп в стену. Вы всегда должны давать своим объектам явные имена, а не полагаться на неявные.

Thom A 29.06.2024 13:35

@ThomA - это неверно для ограничений во временных таблицах, созданных хранимыми процессами. Они всегда должны использовать неявные имена, так как в противном случае вы сможете создать только один экземпляр таблицы, и попытки одновременного выполнения процесса завершится неудачей по этой причине, а явные имена ограничений также предотвратят кэширование объектов временной таблицы.

Martin Smith 29.06.2024 13:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
164
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне это нужно из-за проблем, описанных в dba.stackexchange.com: В базе данных уже есть объект с именем PK_MyPrimaryKey ( первичный индекс во временной таблице)

Нет, ты не знаешь. Это не удается (с ошибкой «В базе данных уже есть объект с именем «PK1»).

DROP TABLE IF EXISTS #T1, #T2

CREATE TABLE #T1 ([ID] INT CONSTRAINT PK1 PRIMARY KEY)

CREATE TABLE #T2 ([ID] INT CONSTRAINT PK1 PRIMARY KEY)

Поскольку он создает ограничение и соответствующий объект в sys.objects — где имена объектов должны быть уникальными в пределах схемы.

Это не

DROP TABLE IF EXISTS #T1, #T2

CREATE TABLE #T1 ([ID] INT NOT NULL INDEX IX UNIQUE CLUSTERED)

CREATE TABLE #T2 ([ID] INT NOT NULL  INDEX IX UNIQUE CLUSTERED)

Имена индексов должны быть уникальными только внутри таблицы — нет проблем с одновременно существующими несколькими разными таблицами, которые используют общие имена индексов. Многие из встроенных объектов имеют довольно скучные индексные имена, такие как clst, как видно из.

SELECT name, 
       COUNT(*), 
       type_desc
FROM sys.indexes
GROUP BY name, 
         type_desc
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC

SQL Server 2000 даже не имел этого ограничения и допускал дублирование имен индексов внутри таблицы. Если вы были в таком положении, то решение этого вопроса было необходимым изменением перед обновлением до версии 2005.

Я удалил свой пост - вы правы, пере#нейминг. Хотя я клянусь, что имя индекса #temp где-то устранило проблему, я просто не могу вспомнить, где. В любом случае, ставлю вам палец вверх.

seanb 29.06.2024 13:17

Другие вопросы по теме