#sql #sql-server #null #foreign-keys
Вопрос:
Я пытаюсь выполнить очень простую задачу — соединить две таблицы с помощью внешнего ключа. Однако после успешного создания ключа столбец в основной таблице заполнен нулевыми значениями.
Я попытался создать связь как со сценарием, так и с помощью опции «Таблица дизайна».
Итак, у меня есть две таблицы — Пловец (имеет 100000 строк)
CREATE TABLE [dbo].[Swimmer]( [SwimmerID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [PassportNumber] [nvarchar](20) , [BirthDate] [date] NOT NULL, [Gender] [nvarchar](5) , [Rank] [nvarchar](10) , [CoachID] [int] )
И тренер (имеет 10000 рядов):
[CoachID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NOT NULL, [PassportNumber] [nvarchar](20) )
Я хочу соединить их по идентификатору CoachID, поэтому идентификатор столбца CoachID в Swimmer становится внешним ключом, который ссылается на идентификатор столбца CoachID в Coach, однако, когда я это делаю, идентификатор столбца CoachID в Swimmer просто показывает NULL в каждой строке. Моей следующей задачей будет создать отношения «один ко многим» (поскольку один тренер может обучать нескольких пловцов), но сейчас я просто хочу выяснить, почему связь не работает
Комментарии:
1. Как вы добавляете внешний ключ?
2. Вы имеете в виду, что в вашей таблице пловцов есть данные в столбце CoachID, которые исчезают при добавлении внешнего ключа?!?
3. Пожалуйста, поделитесь кодом, который вы использовали, когда пытались добавить внешний ключ. В принципе, вы должны заполнить обе таблицы, а затем вернуться и обновить идентификатор тренера в таблице пловцов на основе некоторой логики или сопоставления… как вы узнаете, какой пловец получит какого тренера? вот в чем твоя проблема.
4. Какой внешний ключ? Там нет ни одного определенного. И столбец внешнего ключа содержит значение, не являющееся
NULL
значением, только в том случае, если выINSERT
илиUPDATE
строка указали значение столбца; SQL Server «волшебным образом» не знает, какое значение оно должно быть, когда вы его определяете.5. Я считаю, что простое создание связи внешнего ключа между двумя таблицами не приводит к автоматическому заполнению значений в вашей
Swimmer
таблице. После создания связи вам необходимо перейти и обновитьSwimmer.CoachId
значения, чтобы они содержали значения идентификаторов, указанные вCoach
таблице.