【问题标题】:How to create two separate foreign key columns in two different tables with the same name in a database如何在数据库中同名的两个不同表中创建两个单独的外键列
【发布时间】:2021-01-03 19:14:44
【问题描述】:

我写了这段代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[USERS]
(
    [ID] [int] NOT NULL,
    [First_Name] [varchar](50) NOT NULL,
    [Last_Name] [varchar](50) NOT NULL,
    [email] [varchar](50) NOT NULL,
    [Password] [text] NOT NULL,
    [User_Type] [tinyint] NOT NULL,
    [Date_of_Birth] [date] NOT NULL,
    [Gender] [varchar](50) NULL,
    [Login_with] [tinyint] NOT NULL,
    [Phone] [int] NOT NULL,
    [Receive_Coupon] [int] NULL,
    [Country_ID] [int] NOT NULL,
    [Created] [datetime] NOT NULL,
    [Modified] [datetime] NOT NULL,
    [Status] [tinyint] NOT NULL,
    [Language_ID] [int] NOT NULL,
    CONSTRAINT Country_ID FOREIGN KEY (ID) REFERENCES COUNTRIES,
    CONSTRAINT Language_ID FOREIGN KEY (ID) REFERENCES LANGUAGE,
    CONSTRAINT [PK_USERS] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

但我得到了这个错误

除了更改Country_ID 列的名称,我该如何解决这个错误?

enter image description here

【问题讨论】:

  • 您只会通过以建议列的方式命名约束来引起更多混乱。并且不要使用 text 数据类型 - 许多年前已弃用。此外,您需要研究和实施适当的安全实践。您永远不应该存储纯文本密码。事实上,这里有很多安全/PII 问题需要解决。

标签: sql sql-server database foreign-keys key


【解决方案1】:

假设您想在以下之间建立外键约束:

  • dbo.Users.Country_Iddbo.Countries.Id
  • dbo.Users.Language_Iddbo.Language.Id

但您现在不这样做 - 而是使用以下语法:

CREATE TABLE [dbo].[USERS]
(
    -- all your columns here
    CONSTRAINT FK_Users_Countries 
        FOREIGN KEY (Country_ID) REFERENCES dbo.Countries(ID),
    CONSTRAINT FK_Users_Language
        FOREIGN KEY (Language_ID) REFERENCES dbo.Language(Id),
    CONSTRAINT [PK_USERS] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
)

你需要

  • 为您的 FK 约束命名(例如 FK_Users_Countries
  • 然后定义当前表 (dbo.Users) 中的哪一列是外键列(例如 Country_Id - 在 FOREIGN KEY (column) 部分中)
  • 然后定义它引用的内容 - 通常是表和该表中的列(在 REFERENCES 关键字之后)

您当前的代码:

CONSTRAINT Country_ID FOREIGN KEY (ID) REFERENCES COUNTRIES,

正在定义一个名为Country_ID 的外键约束,它将dbo.Users.ID 列与Countries 表的主键相匹配。很可能,您已经有另一个表具有相同的错误代码行,因此已经定义了一个名为 Country_ID 的约束 - 而您只是 不能 拥有两个具有相同名称的数据库对象 - 没有解决方法这里....

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2019-10-23
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    相关资源
    最近更新 更多