Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Unique Constraint über mehrere Tabellen hinweg

Fügen Sie eine vierte Tabelle speziell für diese Werte hinzu, die eindeutig sein sollen, und verknüpfen Sie dann diese Schlüssel aus dieser Tabelle mit den anderen, indem Sie eine Eins-zu-Viele-Beziehung verwenden. Zum Beispiel haben Sie die eindeutige Tabelle mit einer ID, AppName und ItemName, um ihre 3 zu bilden Säulen. Dann lassen Sie diese Tabelle mit den anderen verlinken.

Wie das geht, ist hier ein gutes Beispiel. Erstellen Sie eine Eins-zu-Viele-Beziehung mit SQL Server

BEARBEITEN: Dies ist, was ich tun würde, aber in Anbetracht Ihrer Serveranforderungen können Sie ändern, was benötigt wird:

CREATE TABLE AllItems(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [itemType] [int] NOT NULL,
    [AppName] [nvarchar](20) NOT NULL,
    [ItemName] [nvarchar](32) NOT NULL,
    CONSTRAINT [pk_AllItems] PRIMARY KEY CLUSTERED ( [id] ASC )
) ON [PRIMARY]

CREATE TABLE Analog(
    [itemId] [int] NOT NULL,
    [Value] [float] NOT NULL
)

CREATE TABLE Discrete(
    [itemId] [int] NOT NULL,
    [Value] [bit] NOT NULL
)

CREATE TABLE Message(
    [itemId] [bigint] NOT NULL,
    [Value] [nvarchar](256) NOT NULL
)

ALTER TABLE [Analog] WITH CHECK 
    ADD CONSTRAINT [FK_Analog_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Analog] CHECK CONSTRAINT [FK_Analog_AllItems]
GO

ALTER TABLE [Discrete] WITH CHECK 
    ADD CONSTRAINT [FK_Discrete_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Discrete] CHECK CONSTRAINT [FK_Discrete_AllItems]
GO

ALTER TABLE [Message] WITH CHECK 
    ADD CONSTRAINT [FK_Message_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Message] CHECK CONSTRAINT [FK_Message_AllItems]
GO

Soweit ich das beurteilen kann, ist Ihre Syntax in Ordnung, ich habe sie einfach so geändert, weil ich damit vertrauter bin, aber beides sollte funktionieren.