Составной ключ с одним компонентом, являющимся внешним ключом - PullRequest
0 голосов
/ 12 июля 2020

У меня есть финансовое приложение, в котором я храню данные тикеров ежедневно, поэтому я создаю первичный ключ из Ticker и Date.

Мне также нужно сделать Ticker (который является частью указанного выше составного ключа) внешний ключ другой таблицы с именем Tickers.

Однако, когда я go добавляю отношения внешнего ключа в SQL Server Management Studio, он просит меня предоставьте ссылку для обоих столбцов Ticker и Date, тогда как таблица Ticker содержит только Ticker (это то, что я хочу только привязать).

Любые идеи о том, что я делаю неправильно, пожалуйста, или это невозможно?

Мои таблицы следующие:

CREATE TABLE [dbo].[Tickers](
    [Ticker] [nvarchar](8) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Market] [int] NOT NULL,
    [Locale] [int] NOT NULL,
    [Type] [int] NOT NULL,
    [Active] [bit] NOT NULL,
    [PrimaryExch] [nvarchar](50) NOT NULL,
    [Updated] [datetime2](7) NOT NULL,
    [Currency] [int] NOT NULL,
CONSTRAINT [PK_Tickers] PRIMARY KEY CLUSTERED 
(
    [Ticker] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[AggregateDay](
    [Ticker] [nchar](8) NOT NULL,
    [Date] [date] NOT NULL,
    [Volume] [decimal](18, 0) NULL,
    [Open] [decimal](18, 0) NULL,
    [Close] [decimal](18, 0) NULL,
    [High] [decimal](18, 0) NULL,
    [Low] [decimal](18, 0) NULL,
    [Samples] [int] NULL,
 CONSTRAINT [PK_AggregateDay] PRIMARY KEY CLUSTERED 
(
    [Ticker] ASC,
    [Date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

студия

1 Ответ

3 голосов
/ 12 июля 2020

Одна проблема с вашей настройкой заключается в том, что родительский и дочерний столбцы имеют разные типы данных: [dbo].[Tickers]([Ticker]) - [nvarchar](8), а [dbo].[AggregateDay](Ticket) - [nchar](8).

Если вы выровняете оба типа данных, тогда вы можете создать отношения, например:

CREATE TABLE [dbo].[AggregateDay](
    [Ticker] [nvarchar](8) NOT NULL 
        REFERENCES [dbo].[Tickers]([Ticker]),  -- foreign key declaration
    [Date] [date] NOT NULL,
    [Volume] [decimal](18, 0) NULL,
    [Open] [decimal](18, 0) NULL,
    [Close] [decimal](18, 0) NULL,
    [High] [decimal](18, 0) NULL,
    [Low] [decimal](18, 0) NULL,
    [Samples] [int] NULL,
CONSTRAINT [PK_AggregateDay] PRIMARY KEY CLUSTERED 
    ([Ticker] ASC, [Date] ASC)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    ON [PRIMARY]
) ON [PRIMARY]

Демо на DB Fiddle

...