Добавить уникальное ограничение SQL на основе поля в связанной родительской таблице - PullRequest
0 голосов
/ 26 декабря 2018

Я ищу правильный способ сделать это.Я использую Azure SQL.

Сводка. Можно ли создать ограничение следующим образом:

 CONSTRAINT [UC_constraint_name] UNIQUE NONCLUSTERED ([field1_this_table] ASC, [field2_this_table] ASC, [Parent_Table].[Field_In_Parent_Table]) ASC)

Сведения

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

Простой и прямой.

Мое текущее ограничение на таблицу item_detail:

   CONSTRAINT [UC_unique_scan_code_customer_id] UNIQUE NONCLUSTERED ([customer_id] ASC, [unique_scan_code] ASC),

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

Я добавил новое поле (и связанную с ним таблицу, но это не должно иметь значения здесь) на уровне заказа с именем customer_geo_zone_number, чтобы все элементы, назначенныеэтот порядок будет для этой geo_zone.

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

Моим первоначальным решением было просто добавить поле, но это, кажется, нарушает правила нормализации базы данных, сохраняя одно и то же поле 'customer_geo_zone_number' в двух связанных таблицах.

Это ограничение, которое я пытался добавить(к моей таблице элементов), но это неправильный синтаксис (но он показывает, что я хочу сделать):

CONSTRAINT [UC_unique_scan_code_customer_id2] UNIQUE NONCLUSTERED ([customer_id] ASC, [unique_scan_code] ASC, [Order_Detail.customer_geo_zone_number]),

Если это полезно, вот текущая таблица элементов SQL:

CREATE TABLE [dbo].[item_detail] (
[Id]               INT             IDENTITY (1, 1) NOT NULL,
[job_id]           BIGINT          NULL,
[order_id]         BIGINT          NULL,
[customer_id]      INT             NOT NULL,
[unique_scan_code] VARCHAR (100)   NOT NULL,
[item_description] VARCHAR (100)   NULL,
[cust_code_1]      VARCHAR (100)   NULL,
[cust_code_2]      VARCHAR (100)   NULL,
[cust_code_3]      INT             NULL,
[cust_code_4]      DECIMAL (18, 2) NULL,
[container_type]   INT             NULL,
[record_created]   DATETIME        DEFAULT (getdate()) NOT NULL,
[send_XML_flag]    BIT             DEFAULT ((1)) NOT NULL,
[dt_item_seq_no]   INT             NULL,
CONSTRAINT [PK_item_detail] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [UC_unique_scan_code_customer_id] UNIQUE NONCLUSTERED ([customer_id] ASC, [unique_scan_code] ASC),
CONSTRAINT [FK_item_detail_To_Customer_Detail] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[Customer_Detail] ([Id]),
CONSTRAINT [FK_item_detail_To_Order_Detail] FOREIGN KEY ([order_id]) REFERENCES [dbo].[Order_Detail] ([Id]) ON DELETE CASCADE
);

и вот таблица заказа sql:

CREATE TABLE [dbo].[Order_Detail] (
[Id]                           BIGINT          IDENTITY (1, 1) NOT NULL,
[customer_id]                  INT             NOT NULL,
[dt_unique_id]                 INT             NULL,
[dt_customer_no]               INT             NULL,
[customer_BOL]                 VARCHAR (50)    NULL,
[customer_unique_id]           VARCHAR (50)    NOT NULL,
[customer_invoice_number]      VARCHAR (50)    NULL,
[customer_order_number]        VARCHAR (50)    NULL,
[customer_po_number]           VARCHAR (50)    NULL,
[customer_stop_id]             VARCHAR (50)    NULL,
[customer_route_id]            VARCHAR (50)    NULL,
[customer_terminal_id]         VARCHAR (50)    NULL,
[customer_del_route_seq_alpha] VARCHAR (50)    NULL,
[customer_del_route_seq_num]   INT             NULL,
[customer_misc_Vref_1]         VARCHAR (50)    NULL,
[customer_misc_Vref_2]         VARCHAR (50)    NULL,
[customer_misc_Vref_3]         VARCHAR (50)    NULL,
[customer_misc_Vref_4]         VARCHAR (50)    NULL,
[customer_misc_Cref_1]         CHAR (1)        NULL,
[customer_misc_Cref_2]         CHAR (1)        NULL,
[customer_misc_Cref_3]         CHAR (1)        NULL,
[customer_misc_Cref_4]         CHAR (1)        NULL,
[customer_misc_Nref_1]         DECIMAL (18)    NULL,
[customer_misc_Nref_2]         DECIMAL (18)    NULL,
[customer_misc_Nref_3]         DECIMAL (18, 2) NULL,
[customer_misc_Nref_4]         DECIMAL (18, 2) NULL,
[Order_notes]                  VARCHAR (MAX)   NULL,
[Pickup_Location_Id]           INT             NULL,
[Delivery_Location_Id]         INT             NULL,
[requested_pu_date]            DATETIME        NULL,
[requested_del_date]           DATETIME        NULL,
[expected_item_qty]            INT             NULL,
[record_created]               DATETIME        DEFAULT (getdate()) NOT NULL,
[revenue_terminal_id]          INT             NULL,
[initial_route_id]             INT             NULL,
[delivery_branch_id]           INT             NULL,
[customer_geo_zone_number]     INT             NULL DEFAULT 0,
CONSTRAINT [PK_Order_Detail] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [unique_cust_id_Orders_cust_unique_id] UNIQUE NONCLUSTERED ([customer_id] ASC, [customer_unique_id] ASC),
CONSTRAINT [FK_Order_Detail_To_Customer_Detail] FOREIGN KEY ([customer_id]) REFERENCES [dbo].[Customer_Detail] ([Id]),
CONSTRAINT [FK_Order_Detail_To_Terminal_Detail] FOREIGN KEY ([revenue_terminal_id]) REFERENCES [dbo].[Terminal_Detail] ([Id]),
CONSTRAINT [FK_Order_Detail_To_Common_Address] FOREIGN KEY ([Delivery_Location_Id]) REFERENCES [dbo].[Common_Address_Point] ([Id]),
CONSTRAINT [FK_Order_Detail_To_Common_Address2] FOREIGN KEY ([Pickup_Location_Id]) REFERENCES [dbo].[Common_Address_Point] ([Id]),
CONSTRAINT [FK_Order_Detail_To_Route_Detail] FOREIGN KEY ([initial_route_id]) REFERENCES [dbo].[route_detail] ([Id])
);

1 Ответ

0 голосов
/ 04 января 2019

Мне сказали, что это невозможно (возможно, почему нет предложенных решений). Я закрываю это.

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