Как создать два отдельных столбца внешнего ключа в двух разных таблицах с одинаковыми именами в базе данных

#sql #sql-server #database #foreign-keys #key

#sql #sql-сервер #База данных #внешние ключи #Клавиша

Вопрос:

Я написал этот код:

 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 Как я могу исправить эту ошибку, кроме изменения имени столбца?

введите описание изображения здесь

Комментарии:

1. Вы только вызовете ЕЩЕ БОЛЬШУЮ путаницу, назвав ограничение так, чтобы оно указывало на столбец. И НЕ используйте текстовый тип данных, который устарел много-много лет назад. Кроме того, вам необходимо изучить и внедрить надлежащие методы обеспечения безопасности. Вы НИКОГДА не должны хранить обычный текстовый пароль. На самом деле, здесь необходимо рассмотреть не только несколько вопросов безопасности / PII.

Ответ №1:

Я предполагаю, что вы хотите установить ограничения внешнего ключа между:

  • dbo.Users.Country_Id и dbo.Countries.Id
  • dbo.Users.Language_Id и dbo.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 — и у вас просто не может быть двух объектов базы данных с одинаковым именем — здесь нет обходного пути….