Как использовать первичный ключ с таблицей разделов - PullRequest
0 голосов
/ 10 октября 2019

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

Действительно, следующий скрипт не работает

CREATE TABLE commande
(
id INT IDENTITY,
date_commande DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_id_commande PRIMARY KEY(id)
)
ON scheme_partition_date(date_commande);
GO

Выдает следующую ошибку: «command_date» - это столбец раздела индекса «pk_command_id». Столбцы раздела одного индекса должны быть подмножеством ключа индекса.

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

ALTER TABLE commande
ADD CONSTRAINT pk_commande_id PRIMARY KEY NONCLUSTERED (id);

Но он выдает ту же ошибку:

"command_date" - это столбец раздела индекса "pk_command_id",Столбцы разделов одного индекса должны быть подмножеством ключа индекса.

Я вижу, что кто-то предлагает мне это решение: Столбцы разделов для уникального индекса должны быть подмножеством ошибки ключа индекса

Но это ошибка для меня.

Представьте, что вы хотите разбить таблицу на основе таких критериев, как архивирование.

Например, записи таблицы, которые не являютсяв архиве перейдите к первому разделу, а остальные к второму. Допустим, это поле архивации называется «заархивировано».

Хотите создать раздел на основе этого поля, например:

CREATE PARTITION FUNCTION fct_archived(int)
AS RANGE FOR VALUES (0,1);
GO GO

CREATE PARTITION SCHEME scheme_archived
AS PARTITION fct_archived TO (FILEGROUP01, FILEGROUP02, FILEGROUP03);
GO GO

Это означает, что моя таблица включает в свой первичный ключстолбец «заархивирован».

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

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

Кто-нибудь уже сталкивался с проблемой?

1 Ответ

1 голос
/ 13 октября 2019

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

По умолчанию индексы создаются на том же самомПространство данных (т. Е. Файловая группа или схема секционирования) в виде таблицы.

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

CREATE TABLE commande
(
  id INT IDENTITY,
  date_commande DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT pk_id_commande PRIMARY KEY NONCLUSTERED (id) ON [Primary]
)
ON scheme_partition_date(date_commande);

Кстати, это создаст таблицу кучи, что, вероятно, является худшим вариантом. Возможно, вы захотите выбрать между кластеризованным индексом, включая date_commande, или Clustered Columnstore для хранения основной таблицы.

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