Отношение к столбцу идентификации, который не является первичным ключом - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть таблица Customers, где ID (INT) - это столбец Identity (1,1), а CustomerID (NVARCHAR) - первичный ключ. У меня есть вторая таблица с CustID (INT), и я хотел бы создать отношение к Customers столбцу ID таблицы.

Студия управления SQL Server уведомила меня, что нет соответствующего первичного ключа или уникального ограничения - поэтому я добавил ограничение на столбец идентификатора Customers, чтобы сделать его уникальным. То же сообщение.

primary key or unique constraint error

РЕДАКТИРОВАТЬ Добавление моих сценариев SQL для таблиц, ограничений и отношений

CREATE TABLE [dbo].[Customers]
(
    [CustomerID] [nvarchar](5) NOT NULL,
    [CompanyName] [nvarchar](40) NOT NULL,
    [ContactName] [nvarchar](30) NULL,
    [ContactTitle] [nvarchar](30) NULL,
    [Address] [nvarchar](60) NULL,
    [Address2] [nvarchar](60) NULL,
    [City] [nvarchar](30) NULL,
    [State] [char](2) NULL,
    [Region] [nvarchar](15) NULL,
    [PostalCode] [nvarchar](10) NULL,
    [Country] [nvarchar](15) NULL,
    [Phone] [nvarchar](24) NULL,
    [Fax] [nvarchar](24) NULL,
    [ID] [int] IDENTITY(1,1) NOT NULL,

    CONSTRAINT [PK_Customers] 
        PRIMARY KEY CLUSTERED ([CustomerID] ASC),
    CONSTRAINT [ID_Unique] 
        UNIQUE NONCLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Customers] 
    ADD CONSTRAINT [DF_Customers_State]  DEFAULT ('VA') FOR [State]
GO

ALTER TABLE [dbo].[Customers]  WITH CHECK 
    ADD CONSTRAINT [FK_CustomersStates] 
        FOREIGN KEY([State]) REFERENCES [dbo].[States] ([Abbrev])
GO

ALTER TABLE [dbo].[Customers] CHECK CONSTRAINT [FK_CustomersStates]
GO


-- =======================================================================

CREATE TABLE [dbo].[Quote]
(
    [Id] [int] NOT NULL,
    [Number] [nvarchar](15) NOT NULL,
    [SalesPersonId] [int] NULL,
    [CustId] [int] NOT NULL,
    [Description] [nvarchar](max) NULL,
    [Status] [int] NULL,
    [QuoteDate] [datetime] NULL,

    CONSTRAINT [PK_Quote] 
        PRIMARY KEY NONCLUSTERED ([Id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Quote]  WITH CHECK 
    ADD CONSTRAINT [FK_tbl_Quote_tbl_SalesPerson] 
       FOREIGN KEY([SalesPersonId]) REFERENCES [dbo].[SalesPerson] ([Id])
GO

ALTER TABLE [dbo].[Quote] CHECK CONSTRAINT [FK_tbl_Quote_tbl_SalesPerson]
GO

ALTER TABLE [dbo].[Quote]  WITH CHECK 
    ADD CONSTRAINT [FK_tbl_Quote_tbl_Status] 
        FOREIGN KEY([Status]) REFERENCES [dbo].[Status] ([Id])
GO

ALTER TABLE [dbo].[Quote] CHECK CONSTRAINT [FK_tbl_Quote_tbl_Status]
GO

-- ================================================================

CREATE TABLE [dbo].[States]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Abbrev] [char](2) NOT NULL,

    CONSTRAINT [PK_States_1] 
        PRIMARY KEY CLUSTERED ([Abbrev] ASC)
) ON [PRIMARY]
GO

-- ==================================================================

CREATE TABLE [dbo].[Status]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Description] [nvarchar](50) NOT NULL,

    CONSTRAINT [PK_Status_Id] 
        PRIMARY KEY NONCLUSTERED ([Id] ASC)
) ON [PRIMARY]
GO

--------- ==========================================================

ALTER TABLE CUSTOMERS
Add  Constraint ID_Unique UNIQUE (ID)

-- =========================================================================

ALTER TABLE QUOTE

 ADD CONSTRAINT  FK_QuoteCustId_CustomerId
    FOREIGN KEY (CustId)
    REFERENCES dbo.CUSTOMERS (ID)
    ON DELETE  NO ACTION 
    ON UPDATE  NO ACTION 

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Ваша ошибка невоспроизводима.

Я взял код из вашего вопроса, изменил порядок операторов CREATE TABLE, чтобы таблицы Status и State были созданы до Customer. И я также вынул создание дубликата Constraint:

--this already exists
 CONSTRAINT [ID_Unique] UNIQUE NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--so don't create this
 ALTER TABLE CUSTOMERS
Add  Constraint ID_Unique UNIQUE (ID)

И я смог запустить ваш код, не обнаружив описанную вами ошибку. Единственной ошибкой, которую я получил, было создание FK для SalesPerson, потому что вы не включили DDL для этой таблицы.

Поэтому существует некоторая разница в коде, который вы выполняете, и коде, который вы показываете нам, который вызывает вашу ошибку.

0 голосов
/ 05 сентября 2018

Это работает для меня.

create table tmp.Customer(ID  INT identity(1,1) , CustID varchar(8) primary key);
GO
create table tmp.Second(blah int, RefCustID INT);
GO
Create unique index UX1 on tmp.Customer(ID)
GO
ALTER TABLE tmp.Second
ADD CONSTRAINT whatever
FOREIGN KEY (RefCustID) 
REFERENCES tmp.Customer(ID)
GO

Я подозреваю, что вы поменяли местами имена таблиц Customer и Second в команде ALTER TABLE, которая создает внешний ключ. (это чаще, чем вы думаете)

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

create table tmp.Customer(ID  INT identity(1,1) , CustID varchar(8) primary key);
GO
create table tmp.Second(blah int, RefCustID INT);
GO
Alter table Tmp.Customer  ADD Constraint UX1 Unique (ID)
GO
ALTER TABLE tmp.Second
ADD CONSTRAINT whatever
FOREIGN KEY (RefCustID) 
REFERENCES tmp.Customer(ID)
GO

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

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