2016-11-25 3 views
1

Я довольно новичок в SQL и хотел бы попросить помощи, поскольку я борюсь с проблемой внешнего ключа. Я искал и искал поиски в течение нескольких дней без каких-либо результатов.SQL external key возвращает NULL

Моя проблема в том, что я создаю 2 таблицы, где один с первичным ключом, а второй с первичным ключом и внешним ключом. Вы можете увидеть ниже примере кода:

CREATE TABLE CarList 
(
    C_Id int IDENTITY (1,1) PRIMARY KEY, 
    Car_Model nvarchar(255), 
) 

Чем я вставка данных в эту таблицу, как показано ниже:

INSERT INTO CarList (Car_Model) 
VALUES ('AUDI'), ('BMW'), ('PORSCHE') 

Чем я создаю вторую таблицу с внешним ключом, как показано ниже:

CREATE TABLE Series 
(
    S_Id int IDENTITY (1,1) PRIMARY KEY, 
    Car_Series nvarchar(255), 
    Car_Id int FOREIGN KEY REFERENCES CarList(C_Id) 
) 

И как заключительный шаг я вставляя данные для второй таблицы:

INSERT INTO Series(Car_Series) 
VALUES ('911c'), ('330d'), ('80TDI') 

Здесь моя проблема на самом деле приходит. После того, как я установил все и вызову таблицу с внешним ключом, столбец, который должен иметь значение внешнего ключа, будет отображаться как NULL. Я установил связь между обеими таблицами в SQL Server Management Studio, но результат все тот же.

Затем я пытаюсь сопоставить обе таблицы с объединениями и тем же. Все, что я читал в Интернете, в основном не говорит о том, как значение должно появляться в столбце внешнего ключа или, по крайней мере, я не понимаю. Я хочу, чтобы первые модели настольных машин соответствовали второй таблице, вызывающей их по идентификатору. Поэтому, если я хочу вызвать ID 1 из первой таблицы, которая является AUDI, чтобы получить вторую таблицу ID серии 80TDI.

Не могли бы вы помочь?

ответ

2

Вам нужно вставить значение внешнего ключа при наполнении серии таблицы, например:

INSERT INTO Series(Car_Series) 
VALUES 
('911c', 3), 
('330d', 2), 
('80TDI', 1) 

Насколько я могу видеть ваш иностранный (я не большой на автомобилях!) ключевые точки к таблице, которая обозначает изготовитель автомобиля (например, Audi, BMW). Когда вы добавляете данные в Series Sql Server не знает производителя (он знает меньше о машинах, чем мне!), Поэтому вы должны это рассказать.

ограничение внешнего ключа просто означает, что Sql не, скажем, ключ вы добавляете Golf следующим образом:

INSERT INTO Series(Car_Series) 
VALUES 
('Golf', 4) 

, если вы бы уже создали Volkswagen с ключом 4 в вашей *CarList* таблице.

Кстати, вы можете установить столбец внешнего ключа, чтобы он не разрешал null - это хорошая практика, если вы хотите, чтобы все его записи ссылались на родительскую таблицу.

+0

Спасибо Марк! Теперь совершенно ясно. Единственное, что приходит мне в голову, - что, если у меня есть действительно огромное количество данных для вставки во вторую таблицу? Не добавляли ли соответствующее число слишком много времени?Может быть, автоматическая опция для этого или я должен пойти с этим подходом? – TheShadow

+0

Нет, это не должно увеличивать накладные расходы, если оно находится в одном и том же вставке. Также объем данных низкий, так как он всего лишь целое число. –

+0

Еще раз спасибо! Теперь ясно :) – TheShadow

1
you need to insert data in foreign key when populating the Series table 

    CREATE TABLE CarList 
(
C_Id int IDENTITY (1,1) PRIMARY KEY, 
Car_Model nvarchar(255), 
) 

INSERT INTO CarList (Car_Model) 
VALUES 
('AUDI'), 
('BMW'), 
('PORSCHE') 

CREATE TABLE Series 
(
S_Id int IDENTITY (1,1) PRIMARY KEY, 
Car_Series nvarchar(255), 
Car_Id int FOREIGN KEY REFERENCES CarList(C_Id) 
) 

INSERT INTO Series(Car_Series,Car_Id) 
VALUES 
('911c', 3), 
('330d', 2), 
('80TDI', 1) 

select * from CarList a join Series b on a.C_Id=b.Car_Id 
where C_Id=1 

выход

C_Id Car_Model S_Id Car_Series Car_Id 
1   AUDI  3  80TDI  1 
+0

Спасибо, Chanukya! – TheShadow

Смежные вопросы