Я ищу правильный способ сделать это.Я использую 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])
);