Проблемы с внешними ключами в sqlite3 - PullRequest
1 голос
/ 27 мая 2019

Я получаю ошибку "неизвестный столбец" CustID "в определении внешнего ключа" и "нет такой таблицы: serviceticket"

Кто-нибудь может мне помочь?

drop table if exists customer;
drop table if exists serviceticket; 

PRAGMA foreign_keys = ON; 

create table customer (CustID char(6) not null primary key UNIQUE, 
    CustNAME TEXT, 
    STREET TEXT, 
    CITY TEXT, 
    ZIP INT(5),
    EMAIL VARCHAR, 
    PHONENUMBER INT(10)
    );

create table serviceticket (TicketID char(4) not null primary key, 
    TicketNO char(5), 
    WatchID char(6), 
    DateRecieved char(6), 
    ExpectedDelivery char(6), 
    COMMENTS text, 
    DateReturned char(6),
    FOREIGN KEY (CustID) REFERENCES customer (CustID)
    );

insert into customer (CustID, CustNAME, STREET, CITY, ZIP, PHONENUMBER, EMAIL) 
    values (170362, 'James', 'Vvegen', New York, 12345, 8170710520, 'brt92@outlook.com');

insert into serviceticket (TicketID, WatchID, CustID, DateRecieved, DateReturned, ExpectedDelivery, COMMENTS, DateReturned)
    values (6745, 87463, 098636, 124319, 362836, 683743, 'Nothing to say', 583728);

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Вы не определили CustID до определения внешнего ключа:

create table serviceticket (TicketID char(4) not null primary key, 
    TicketNO char(5), 
    WatchID char(6), 
    DateRecieved char(6), 
    ExpectedDelivery char(6), 
    COMMENTS text, 
    DateReturned char(6),
    CustID char(6),
    FOREIGN KEY (CustID) REFERENCES customer(CustID)
    );
0 голосов
/ 27 мая 2019

Код ниже будет работать.

Это имеет три изменения вместо использования FOREIGN KEY (CustID) REFERENCES customer (CustID), что требует определения столбца CustID в таблице serviceticket ; CustID REFERENCES customer (CustID), это определяет столбец CustID и устанавливает ограничение внешнего ключа.

Второе изменение заменяет 098636 , что приведет к конфликту ограничений внешнего ключа, с 170362 , которое является значением, которое существует в столбце CustID Заказчик Таблица.

например. : -

Это работает (после того, как таблица была правильно определена): -

    insert into serviceticket (TicketID, WatchID, CustID, DateRecieved, DateReturned, ExpectedDelivery, COMMENTS, DateReturned)
    values (6745, 87463, '170362', 124319, 362836, 683743, 'Nothing to say', 583728)
> Affected rows: 1
> Time: 0.082s

Это (согласно сообщению) завершится ошибкой

insert into serviceticket (TicketID, WatchID, CustID, DateRecieved, DateReturned, ExpectedDelivery, COMMENTS, DateReturned)
values (6745, 87463, 098636, 124319, 362836, 683743, 'Nothing to say', 583728)
> FOREIGN KEY constraint failed
> Time: 0s

Третье изменение меняет порядок, в котором отбрасываются таблицы.

Рабочий код

drop table if exists serviceticket; -- <<<<<<<<<< if not coding ON DELETE CASCADE the children have to be deleted first (so moved before dropping customer table) 
drop table if exists customer;


PRAGMA foreign_keys = ON; 

create table customer (CustID char(6) not null primary key UNIQUE, 
    CustNAME TEXT, 
    STREET TEXT, 
    CITY TEXT, 
    ZIP INT(5),
    EMAIL VARCHAR, 
    PHONENUMBER INT(10)
    );

create table serviceticket (TicketID char(4) not null primary key, 
    TicketNO char(5), 
    WatchID char(6), 
    DateRecieved char(6), 
    ExpectedDelivery char(6), 
    COMMENTS text, 
    DateReturned char(6),
    CustID REFERENCES customer (CustID) -- <<<<<<<<<< defines the column and foreign key
    );

insert into customer (CustID, CustNAME, STREET, CITY, ZIP, PHONENUMBER, EMAIL) 
    values (170362, 'James', 'Vvegen', 'New York', 12345, 8170710520, 'brt92@outlook.com');

insert into serviceticket (TicketID, WatchID, CustID, DateRecieved, DateReturned, ExpectedDelivery, COMMENTS, DateReturned)
    values (6745, 87463, 
        '170362', -- <<<<<<<<<< MUST match a value in CustID column of the customer table (changed to work)
        124319, 362836, 683743, 'Nothing to say', 583728);

Дополнительно

Вы можете рассмотреть возможность использования (или его вариантов): -

CustID REFERENCES customer (CustID) ON DELETE CASCADE ON UPDATE CASCADE

4,3. ON DELETE и ON UPDATE Действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...