I have the following code:
create table test.dbo.Users
(
Id int identity(1,1) primary key,
Name varchar(36) not null
)
create table test.dbo.Number
(
Id int identity(1,1) primary key,
Number varchar(10) not null,
Name varchar(36) not null foreign key references Users.Name
)
The foreign key throws an error saying Foreign key 'FK__Number__Name__1CF15040' references invalid table 'Users.Name'.
.
What did I do wrong?
asked Nov 20, 2013 at 21:14
2
Please see in this SQLfiddle link, Link
CREATE TABLE NUMBER(
ID INT PRIMARY KEY,
NUMBER VARCHAR(10) NOT NULL,
NAME VARCHAR(36) NOT NULL REFERENCES USERS(NAME)
);
KyleMit♦
35k64 gold badges456 silver badges655 bronze badges
answered Nov 20, 2013 at 21:41
SanthoshSanthosh
1,7711 gold badge15 silver badges25 bronze badges
Foreign key must reference a primary key in another table
I would use the following code
I hope it is useful
use test
create table test.dbo.Users
(
Id int identity(1,1) primary key,
Name varchar(36) not null
)
create table test.dbo.Number
(
Id int identity(1,1) primary key,
Number varchar(10) not null,
Users_Id int not null
constraint fk_Number_Users foreign key (Users_Id)
references Users(Id)
on update no action
on delete no action
)
answered Nov 20, 2013 at 21:55
You should reference the Primary Key of test.dbo.users.
In SQL Server you could do this:
create table Number
(
Id int identity(1,1) primary key,
Number varchar(10) not null,
Name varchar(36) not null ,
Id_FK int not null foreign key references Users(id)
)
In the above, you have a mandatory association between the 2 tables. If you want to have optional relationship, remove the ‘not null’ from Id_Fk….
Note: I don’t know what is the Name column for.
answered Nov 20, 2013 at 21:18
NoChanceNoChance
5,6024 gold badges31 silver badges44 bronze badges
1
For people who were 100% positive that Table does exist, like I was, please be sure to check web.config. I had a typo in there and it was giving this error, which is counter-intuitive if you ask me, but that’s the case.
answered Feb 2, 2015 at 16:21
Zoran P.Zoran P.
8701 gold badge13 silver badges16 bronze badges
If you are running a bunch of scripts to create tables, It might worth to make sure the referenced table script is running before the consumer table.
answered Nov 10, 2020 at 2:03
use [database];
and then create table.
Works for me.
answered Feb 20, 2019 at 12:30
Kamil DKamil D
751 silver badge4 bronze badges
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
CREATE TABLE [dbo].[ЧитателиБиблиотеки]( id_НомерЧитБилета int identity primary key, ФиоЧит varchar(80), ТелефонЧит int, id_НомерЧитЗала int, constraint FKЧитателиБиблиотеки_ЧитальныеЗалы foreign key (id_НомерЧитЗала) references ЧитальныеЗалы(id_НомерЧитЗала) ) /***************Заполнение таблицы ЧитателиБиблиотеки***************/ insert into ЧитателиБиблиотеки(ФиоЧит, ТелефонЧит) values('Иванов Иван Иванович ', '7582488') insert into ЧитателиБиблиотеки(ФиоЧит, ТелефонЧит) values('Сидаров Василий Валентинович', '4569586') select * from ЧитателиБиблиотеки go /****************************************************************/ CREATE TABLE [dbo].[ЗакреплениеКнигиЗаЧитателем]( АвторКниги nchar(20), id_НомерЧитБилета int, id_ШифрКниги int identity primary key, ДатаЗакрКниги date, ДатаВозврКниги date, constraint FKЧитателиБиблиотеки_ЗакреплениеКнигиЗаЧитателем foreign key (id_НомерЧитБилета) references ЧитателиБиблиотеки(id_НомерЧитБилета) ) /***************Заполнение таблицы ЗакреплениеКнигиЗаЧитателем***************/ insert into ЗакреплениеКнигиЗаЧитателем(АвторКниги,ДатаЗакрКниги,ДатаВозврКниги) values('Пушкин А.С', '15.05.2007','23.05.2007') select * from ЗакреплениеКнигиЗаЧитателем go /****************************************************************/ CREATE TABLE [dbo].[ЧитальныеЗалы]( id_НомерЧитЗала int identity primary key, НазвЧитЗала nchar(20), ВместимостьЧитЗала int, ) /****************Заполнение таблицы ЧитальныеЗалы***************/ insert into ЧитальныеЗалы values('Большой зал','3') insert into ЧитальныеЗалы values('Средний зал','5') insert into ЧитальныеЗалы values('Малый зал','7') select * from ЧитальныеЗалы go /****************************************************************/ CREATE TABLE [dbo].[КнигиВБиблиотеке]( id_ШифрКниги int , АвторКниги nchar(20), НазваниеКниги nchar(20), ГодИзданияКниги int, КолЭкзКниги int identity primary key, unique(ГодИзданияКниги), constraint FKКнигиВБиблиотеке_ЗакреплениеКнигиЗаЧитателем foreign key (id_ШифрКниги) references ЗакреплениеКнигиЗаЧитателем(id_ШифрКниги) ) /****************Заполнение таблицы КнигиВБиблиотеке***************/ insert into КнигиВБиблиотеке(НазваниеКниги,ГодИзданияКниги) values('Капитанская дочка', '1836') select * from КнигиВБиблиотеке go /****************************************************************/ CREATE TABLE [dbo].[КолЭкземпляров]( Остаток int, КолЭкзКниги int, unique(КолЭкзКниги), constraint FK_КолЭкземпляров_КнигиВБиблиотеке foreign key (КолЭкзКниги) references КнигиВБиблиотеке(КолЭкзКниги), ) |
Когда вы создаете ссылочное ограничение, вам необходимо убедиться, что таблица и столбец, на которые вы ссылаетесь, уже существуют в базе данных.
Кроме того, тип данных ссылающегося столбца и указанного столбца должен быть одинаковым.
Column 'Product.ProductId' is not the same data type as referencing column
'ProductDescriptions.ProductID' in the foreign key
Итак, сначала создайте таблицу продуктов и установите идентификатор продукта в качестве первичного ключа
CREATE TABLE Product
(
ProductId INT IDENTITY(1,1) PRIMARY KEY,
ProductName VARCHAR(50)
)
CREATE TABLE ProductDescriptions
(
DescriptionsID int PRIMARY KEY NOT NULL,
ProductID INT NOT NULL
,FOREIGN KEY (ProductID) REFERENCES Product(ProductID),
[Description] text NULL
) ;
Когда вы создаете ссылочную зависимость, вам необходимо убедиться, что таблица и столбец, на который вы ссылаетесь, уже существуют в базе данных.
Кроме того, тип данных как столбца-источника, так и столбца-источника должен быть одинаковым
Column 'Product.ProductId' is not the same data type as referencing column
'ProductDescriptions.ProductID' in the foreign key
Поэтому сначала создайте таблицу продуктов и установите идентификатор продукта в качестве первичного ключа.
CREATE TABLE Product
(
ProductId INT IDENTITY(1,1) PRIMARY KEY,
ProductName VARCHAR(50)
)
CREATE TABLE ProductDescriptions
(
DescriptionsID int PRIMARY KEY NOT NULL,
ProductID INT NOT NULL
,FOREIGN KEY (ProductID) REFERENCES Product(ProductID),
[Description] text NULL
) ;
Я пытаюсь запустить этот запрос SQL Server:
USE DB_UBB;
CREATE TABLE dept_emp (
emp_no INT NOT NULL,
dept_no CHAR(4) NOT NULL,
from_date DATE NOT NULL,
to_date DATE NOT NULL,
FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE, -- Error here
FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE, -- And here
PRIMARY KEY (emp_no, dept_no)
);
CREATE INDEX (emp_no);
CREATE INDEX (dept_no);
И я получаю эти ошибки:
Foreign key 'FK__dept_emp__8bc6840bee39d6cef4bd' references invalid table 'employees'.
Foreign key 'fk__dept_emp__99bc0b2304d3f32059a9' references invalid table 'departments'.
Хотя у меня есть эти таблицы:
Что я делаю не так?
РЕДАКТИРОВАТЬ:
Добавлена вся БД:
3 ответа
SQL «скрывает» столбцы из ключа индекса Clustered
в индексах Nonclustered
. Вы создали составной первичный на обоих emp_no,dept_no
Кластерный индекс первичного скроет оба столбца из индексов в следующих запросах и выдаст ошибку
CREATE INDEX (emp_no);
CREATE INDEX (dept_no);
2
Muhammad Nasir
3 Окт 2016 в 19:55
Если вы указываете внешний ключ после спецификаций столбца, попробуйте вместо этого использовать предложение CONSTRAINT:
to_date DATE NOT NULL,
CONSTRAINT fk_dept_emp_dept FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE,
CONSTRAINT fk_dept_emp_emp FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE,
0
K Richardson
3 Окт 2016 в 20:42
По-видимому, я, хотя таблицы были созданы, он их не распознал.
Я добавил <if not exist, create tables>
Я также удалил CREATE INDEX (emp_no);
и CREATE INDEX (dept_no);
, как сказал @Muhammad Nasir, но это не решило проблему со ссылками.
Решение:
USE DB_UBB;
IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='employees' and xtype='U')
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender VARCHAR(1) NOT NULL CHECK (gender IN('M', 'F')),
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
);
GO
IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='departments' and xtype='U')
CREATE TABLE departments (
dept_no CHAR(4) NOT NULL,
dept_name VARCHAR(40) NOT NULL,
PRIMARY KEY (dept_no),
UNIQUE (dept_name)
);
GO
IF NOT EXISTS (SELECT * FROM SYSOBJECTS WHERE name='dept_emp' and xtype='U')
CREATE TABLE dept_emp (
emp_no INT NOT NULL,
dept_no CHAR(4) NOT NULL,
from_date DATE NOT NULL,
to_date DATE NOT NULL,
FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE,
FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE,
PRIMARY KEY (emp_no, dept_no)
);
GO
0
Zirbo Filip
3 Окт 2016 в 22:51