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