我有一个 Customers
表,其中 ID
(INT
) 是一个 Identity
列 (1,1) CustomerID
(NVARCHAR
) 是主键。我有第二个带有 CustID
(INT
) 的表,我想创建与 Customers
表的 ID
的关系专栏。
SQL Server Management Studio 通知我没有匹配的主键或唯一约束 - 因此我在 Customers
的 ID 列上添加了约束以使其唯一。相同的消息。
编辑为表、约束和关系添加我的 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
最佳答案
您的错误不可重现。
我从你的问题中提取了代码,更改了 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)
而且我能够运行您的代码而没有遇到您描述的错误。我遇到的唯一错误是为 SalesPerson
创建 FK,因为您没有包含该表的 DDL。
因此,您正在执行的代码与您向我们展示的导致错误的代码存在一些差异。
关于sql - 与不是主键的标识列的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52190410/