Внешний ключ ссылается на недопустимую таблицу ошибка

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

ojek's user avatar

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's user avatar

KyleMit

35k64 gold badges456 silver badges655 bronze badges

answered Nov 20, 2013 at 21:41

Santhosh's user avatar

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

Anderson Silva's user avatar

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

NoChance's user avatar

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.'s user avatar

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

Amir Chatrbahr's user avatar

use [database];

and then create table.
Works for me.

answered Feb 20, 2019 at 12:30

Kamil D's user avatar

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'.

Хотя у меня есть эти таблицы:

Departments

Employees

Что я делаю не так?


РЕДАКТИРОВАТЬ:

Добавлена ​​вся БД:

enter image description here

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

Понравилась статья? Поделить с друзьями:
  • Внешний диск ошибка драйвера
  • Внешний hdd ошибка ввода вывода
  • Внешниеобработки создать ошибка при вызове метода контекста создать
  • Винда код ошибки 0xc0000225
  • Винда 10 ошибка при запуске виндовс