Я пытаюсь создать уникальное ограничение для нескольких таблиц. Я нашел ответы на подобные вопросы, но они не совсем отражают дух того, что я пытаюсь сделать.
В качестве примера у меня есть три таблицы: t_Analog, t_Discrete, t_Message
CREATE TABLE t_Analog(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [float] NOT NULL,
CONSTRAINT [uc_t_Analog] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Discrete(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [bit] NOT NULL,
CONSTRAINT [uc_t_Discrete] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Message(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [nvarchar](256) NOT NULL,
CONSTRAINT [uc_t_Message] UNIQUE(AppName, ItemName)
)
Моя цель - сделать AppName и ItemName уникальными во всех трех таблицах. Например, имя элемента Y в приложении X не может существовать как в аналоговых, так и в дискретных таблицах.
Обратите внимание, что этот пример надуман, фактические данные для каждого типа различны и достаточно велики, чтобы объединить таблицы и добавить столбец типа довольно уродливо.
Если у вас есть предложения по подходу к этому, я бы с удовольствием их услышал.
---- BEGIN EDIT 2012-04-26 13:28 CST ----
Спасибо всем за ваши ответы!
Кажется, что может быть причина для изменения схемы этой базы данных, и это нормально.
Объединение таблиц в одну таблицу на самом деле не является жизнеспособным вариантом, так как существует порядка 30 столбцов для каждого типа, которые не соответствуют (изменение этих столбцов, к сожалению, не является вариантом). Это может привести к тому, что в каждой строке не будут использоваться большие секции столбцов, которые кажутся плохими.
Добавление четвертой таблицы, например, John Sikora и других, может быть вариантом, но я бы хотел подтвердить это первым.
Модифицирующая схема:
CREATE TABLE t_AllItems(
[id] [bigint] IDENTITY(1,1) NOT NULL,
[itemType] [int] NOT NULL,
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
CONSTRAINT [pk_t_AllItems] PRIMARY KEY CLUSTERED ( [id] )
CONSTRAINT [uc_t_AllItems] UNIQUE([id], [AppName], [ItemName])
) ON [PRIMARY]
CREATE TABLE t_Analog(
[itemId] [bigint] NOT NULL,
[Value] [float] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Discrete(
[itemId] [bigint] NOT NULL,
[Value] [bit] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Message(
[itemId] [bigint] NOT NULL,
[Value] [nvarchar](256) NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
У меня есть только один вопрос относительно этого подхода. Обеспечивает ли это уникальность для всех подкатегорий?
Например, не может существовать "Item", который имеет "id" 9 с таблицами t_Analog, имеющих "itemId" из 9 с "значением" 9.3, и в то же время t_Message имеет "itemId" 9 с ' Значение "foo"?
Я не могу полностью понять этот дополнительный подход к таблице, но я не против.
Пожалуйста, поправьте меня, если я ошибаюсь.