sql - 与不是主键的标识列的关系

标签 sql sql-server database

我有一个 Customers 表,其中 ID (INT) 是一个 Identity 列 (1,1) CustomerID (NVARCHAR) 是主键。我有第二个带有 CustID (INT) 的表,我想创建与 Customers 表的 ID 的关系专栏。

SQL Server Management Studio 通知我没有匹配的主键或唯一约束 - 因此我在 Customers 的 ID 列上添加了约束以使其唯一。相同的消息。

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 

最佳答案

您的错误不可重现。

我从你的问题中提取了代码,更改了 CREATE TABLE 语句的顺序,以便 StatusState 表在 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/

相关文章:

SQL Server 中带变量的 SQL Stuff 函数

sql - 返回由 plpgsql 函数插入的记录

c# - 启用 MSI 时连接到 SQL

sql-server - 如何在 SQL Server 中重新创建触发器?

PHP 比较列值并相应地编辑数据库

Java DB 表继承?

mysql - 从一个表中加入两个 select 语句

mysql - 如何将参数传递给函数?

java - 当确认更新行时,为什么我的PreparedStatement.executeUpdate 返回 0?

sql - 选择 WHERE 日期 = 天