Ошибка при подтверждении новой строки foreign key mismatch

Why am I getting a SQLite «foreign key mismatch» error when executing script below?

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1

Here is main table definition:

 CREATE TABLE [RLSConfig] (
        "rlsconfig_id"      integer PRIMARY KEY AUTOINCREMENT NOT NULL,
        "importer_config_id"        integer NOT NULL,
        "program_mode_config_id"        integer NOT NULL,
        "l2_channel_config_id"      integer NOT NULL,
        "rls_fixed_width"       integer NOT NULL
    ,
        FOREIGN KEY ([importer_config_id])
            REFERENCES [ImporterConfig]([importer_config_id]),
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ImporterConfig]([importer_config_id]),
        FOREIGN KEY ([importer_config_id])
            REFERENCES [ImporterConfig]([program_mode_config_id]),
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ImporterConfig]([program_mode_config_id])
    )

and referenced table:

    CREATE TABLE [ImporterConfig] (
        "importer_config_id"        integer NOT NULL,
        "program_mode_config_id"        integer NOT NULL,
        "selected"      integer NOT NULL DEFAULT 0,
        "combined_config_id"        integer NOT NULL,
        "description"       varchar(50) NOT NULL COLLATE NOCASE,
        "date_created"      datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),
        PRIMARY KEY ([program_mode_config_id], [importer_config_id])
    ,
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ProgramModeConfig]([program_mode_config_id])
    )

I’m trying to create an Associative Entity (N:N) in SQLite like this:

[ Pet —< VaccinePet >— Vaccine ]

And, I have the follow code of my associative entity:

CREATE TABLE  VACINAPET (
        vp_date TEXT NOT NULL,
        vp_is_applied INTEGER DEFAULT 0,
        fk_pet INTEGER,
        fk_vaccine INTEGER,
        FOREIGN KEY (fk_pet) REFERENCES pet (pet_id),
        FOREIGN KEY (fk_vaccine) REFERENCES vaccine (vaccine_id),
        PRIMARY KEY (fk_pet, fk_vaccine) 
);

BUT, I’m getting an error:

foreign key mismatch — «VACCINEPET» referencing «vaccine»: INSERT INTO
VACCINEPET (vp_date, vp_is_applied, fk_pet, fk_vaccine) VALUES
(’23/05/2018′, 0, 1, 1);

When I try to use the INSERT command:

INSERT INTO VACINAPET (vp_data, vp_is_aplicada, fk_pet, fk_vacina)
VALUES (’23/05/2018′, 0, 1, 1);

What could be wrong? I’m not so good in database… :(

MASTER DETAIL: I have data in Pet table and Vaccine table, they are not empty

Why am I getting a SQLite «foreign key mismatch» error when executing script below?

DELETE 
FROM rlsconfig 
WHERE importer_config_id=2 and 
program_mode_config_id=1

Here is main table definition:

 CREATE TABLE [RLSConfig] (
        "rlsconfig_id"      integer PRIMARY KEY AUTOINCREMENT NOT NULL,
        "importer_config_id"        integer NOT NULL,
        "program_mode_config_id"        integer NOT NULL,
        "l2_channel_config_id"      integer NOT NULL,
        "rls_fixed_width"       integer NOT NULL
    ,
        FOREIGN KEY ([importer_config_id])
            REFERENCES [ImporterConfig]([importer_config_id]),
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ImporterConfig]([importer_config_id]),
        FOREIGN KEY ([importer_config_id])
            REFERENCES [ImporterConfig]([program_mode_config_id]),
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ImporterConfig]([program_mode_config_id])
    )

and referenced table:

    CREATE TABLE [ImporterConfig] (
        "importer_config_id"        integer NOT NULL,
        "program_mode_config_id"        integer NOT NULL,
        "selected"      integer NOT NULL DEFAULT 0,
        "combined_config_id"        integer NOT NULL,
        "description"       varchar(50) NOT NULL COLLATE NOCASE,
        "date_created"      datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP),
        PRIMARY KEY ([program_mode_config_id], [importer_config_id])
    ,
        FOREIGN KEY ([program_mode_config_id])
            REFERENCES [ProgramModeConfig]([program_mode_config_id])
    )

I already checked out this question, and thought I had the answer — but then it didn’t look right to me.

I have the following pared down example:

CREATE TABLE pipelines (                                                        
        name VARCHAR NOT NULL,                                                  
        owner VARCHAR NOT NULL,                                                 
        description VARCHAR,                                                    
        PRIMARY KEY (name, owner),                                              
        FOREIGN KEY(owner) REFERENCES user (id)                                 
);                                                                              
CREATE TABLE tasks (                                                            
        id INTEGER NOT NULL,                                                    
        title VARCHAR,                                                          
        pipeline VARCHAR,                                                       
        owner VARCHAR,                                                          
        PRIMARY KEY (id),                                                       
        FOREIGN KEY(pipeline) REFERENCES pipelines (name),                      
        FOREIGN KEY(owner) REFERENCES pipelines (owner)                         
);                                                                              
CREATE TABLE user (                                                           
        id VARCHAR NOT NULL,                                                    
        name VARCHAR,                                                           
        password VARCHAR,                                                       
        PRIMARY KEY (id)                                                        
);                                                                              
pragma foreign_keys=on;                                                         

insert into user values ('wayne', '', '');                                    
insert into pipelines values ('pipey', 'wayne', '');                            
insert into tasks values (1, 'hello', 'pipey', 'wayne'); 

When executing this code, it bails out:

$ sqlite3 foo.sq3 '.read mismatch.sql'    
Error: near line 27: foreign key mismatch

Through the list in the question I cited:

  • the parent table (user) exists.
  • the parent columns (name, owner) exist
  • the parent columns are, in fact, the primary key (I thought that may have been it originally)
  • the child table references all of the primary key columns in the parent table

So what in the world could be causing this error?

I already checked out this question, and thought I had the answer — but then it didn’t look right to me.

I have the following pared down example:

CREATE TABLE pipelines (                                                        
        name VARCHAR NOT NULL,                                                  
        owner VARCHAR NOT NULL,                                                 
        description VARCHAR,                                                    
        PRIMARY KEY (name, owner),                                              
        FOREIGN KEY(owner) REFERENCES user (id)                                 
);                                                                              
CREATE TABLE tasks (                                                            
        id INTEGER NOT NULL,                                                    
        title VARCHAR,                                                          
        pipeline VARCHAR,                                                       
        owner VARCHAR,                                                          
        PRIMARY KEY (id),                                                       
        FOREIGN KEY(pipeline) REFERENCES pipelines (name),                      
        FOREIGN KEY(owner) REFERENCES pipelines (owner)                         
);                                                                              
CREATE TABLE user (                                                           
        id VARCHAR NOT NULL,                                                    
        name VARCHAR,                                                           
        password VARCHAR,                                                       
        PRIMARY KEY (id)                                                        
);                                                                              
pragma foreign_keys=on;                                                         

insert into user values ('wayne', '', '');                                    
insert into pipelines values ('pipey', 'wayne', '');                            
insert into tasks values (1, 'hello', 'pipey', 'wayne'); 

When executing this code, it bails out:

$ sqlite3 foo.sq3 '.read mismatch.sql'    
Error: near line 27: foreign key mismatch

Through the list in the question I cited:

  • the parent table (user) exists.
  • the parent columns (name, owner) exist
  • the parent columns are, in fact, the primary key (I thought that may have been it originally)
  • the child table references all of the primary key columns in the parent table

So what in the world could be causing this error?

В консоли пишет sqlite3.OperationalError: foreign key mismatch — «users» referencing «gang», без использования g_name все нормально, не использовать g_id — та же ошибка.

import sqlite3

with sqlite3.connect("data.db") as db:
	qwe = db.cursor()

qwe.execute('''PRAGMA foreign_keys=ON''')

qwe.execute(""" CREATE TABLE IF NOT EXISTS gang
(
    id INTEGER,
    name TEXT NOT NULL,
    PRIMARY KEY (id, name)
);""")

qwe.execute(""" CREATE TABLE IF NOT EXISTS users
(
    id INTEGER,
    name TEXT NOT NULL,
    g_id INTEGER,
    g_name TEXT,
    PRIMARY KEY (id, g_name)
    FOREIGN KEY (g_id) REFERENCES gang (id) ON DELETE CASCADE
    FOREIGN KEY (g_name) REFERENCES gang (name) ON UPDATE CASCADE
);""")

gid = input("gid:  ")
gname = input("gname:  ")

qwe.execute(''' INSERT INTO gang (id, name) VALUES (?, ?) ''', [gid, gname])

db.commit()

uid = input("uid:  ")
uname = input("uname:  ")
ugid = input("ugid:  ")
qwe.execute(''' INSERT INTO users (id, name, g_id,  g_name) VALUES (?, ?, ?, ?) ''', [uid, uname, ugid, gname])

db.commit()

Вопрос:

Я уже проверил этот вопрос и подумал, что у меня есть ответ, но потом это выглядело не так.

У меня есть следующий пример:

CREATE TABLE pipelines (
name VARCHAR NOT NULL,
owner VARCHAR NOT NULL,
description VARCHAR,
PRIMARY KEY (name, owner),
FOREIGN KEY(owner) REFERENCES user (id)
);
CREATE TABLE tasks (
id INTEGER NOT NULL,
title VARCHAR,
pipeline VARCHAR,
owner VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(pipeline) REFERENCES pipelines (name),
FOREIGN KEY(owner) REFERENCES pipelines (owner)
);
CREATE TABLE user (
id VARCHAR NOT NULL,
name VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
);
pragma foreign_keys=on;

insert into user values ('wayne', '', '');
insert into pipelines values ('pipey', 'wayne', '');
insert into tasks values (1, 'hello', 'pipey', 'wayne');

При выполнении этого кода он выгружается:

$ sqlite3 foo.sq3 '.read mismatch.sql'
Error: near line 27: foreign key mismatch

Через список в вопросе, который я привел:

  • существует родительская таблица (пользователь).
  • существуют родительские столбцы (имя, владелец)
  • родительские столбцы – это, по сути, первичный ключ (я думал, что это было изначально)
  • дочерняя таблица ссылается на все столбцы первичного ключа в родительской таблице

И что в мире может вызвать эту ошибку?

Лучший ответ:

В документации говорится:

Обычно родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны быть совместно подчинены ограничению UNIQUE или иметь индекс UNIQUE.

В таблице pipelines ни столбцы name, ни столбцы owner сами по себе не уникальны.

Я думаю, вы действительно хотите иметь двухстоечный внешний ключ в таблице tasks:

FOREIGN KEY(pipeline, owner) REFERENCES pipelines(name, owner)

Doh, sorry. The transaction workaround was to show the messages, but IIRC the foreign_keys pragma doesn’t have an effect inside a transaction.

That said, the same thing happens with raw sql:

-- partial_fk.sql

CREATE TABLE units (
    id TEXT NOT NULL,
    user TEXT NOT NULL,
    name TEXT NOT NULL,
    PRIMARY KEY (id, user)
);

CREATE TABLE modules (
    id TEXT NOT NULL,
    unit TEXT NOT NULL REFERENCES units (id),
    name TEXT NOT NULL,
    PRIMARY KEY (id, unit)
);

PRAGMA foreign_keys = ON;

INSERT INTO units (id, user, name) VALUES ('id', 'user', 'name');
INSERT INTO modules (id, unit, name) VALUES ('m_id', 'id', 'm_name');

If I run sqlite3 < partial_fk.sql I also get Error: near line 18: foreign key mismatch - "modules" referencing "units". It works as expected if I change the primary key of units to only include PRIMARY KEY (id).

I’ve re-read the docs on foreign keys in sqlite, and it says that

Usually, the parent key of a foreign key constraint is the primary key of the parent table. If they are not the primary key, then the parent key columns must be collectively subject to a UNIQUE constraint or have a UNIQUE index

I think that this is what might be failing here? units (id) is not the primary key, and doesn’t span a uniqueness constraint on its own.

Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

Creating and modifying database tables. My code is exactly like the training video.
The table is created, but no data inserts. It works in the video. I tried dropping the table an re-creating it without inserting data. That worked, but I when I try to insert the data, I get the same error. Why does it work in the video and not for me?

My code:
PRAGMA FOREIGN_KEYS = ON;
DROP TABLE IF EXISTS TICKETS;
CREATE TABLE IF NOT EXISTS TICKETS (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
CONCERT_ID SMALLINT REFERENCES CONCERTS(ID),
TICKET_HOLDER_ID INTEGER REFERENCES TICKET_HOLDERS(ID)
);
INSERT INTO TICKETS VALUES (NULL, 1, 3);
INSERT INTO TICKETS VALUES (NULL, 8, 2);
INSERT INTO TICKETS VALUES (NULL, 5, 1);
INSERT INTO TICKETS VALUES (NULL, 4, 4);
SELECT * FROM TICKETS;

Error: foreign key mismatch — «TICKETS» referencing «CONCERTS»
Video is «creating tickets table»
https://teamtreehouse.com/library/creating-the-tickets-table

3 Answers

JEFF CHAI

The video in CONCERTS table has the primary key in ID column is because teacher start his program from the previous video and continue working to this video. But if you start a new SQL playground, the CONCERTS is missing the primary key it maybe human error when the teacher miss key in the primary key.

In realistic, it is encouraged you to put primary key in the table and to create a realational database. Imagine that the foreign key allow you to target a column which is not a primary key, and the CONCERTS table have 2 same id ‘5’ in the column. The Sql will confuse and getting error, is because they have two ‘5’ in the CONCERTS table but is actually only need one row.
Beside, putting primary key and foreign key can increasing performance and easy for you when doing coding.

Sorry for my broken english, hope you can understand it.

JEFF CHAI

The English language error message for «foreign key mismatch» in the launch SQL Playground is based on the parent key of a foreign key constraint is the primary key of the parent table. If they are not the primary key, then the parent key columns must be collectively subject to a UNIQUE constraint or have a UNIQUE index.

You can run the below code to drop the CONCERTS table and re-create it with a primary key on id.

CREATE TEMPORARY TABLE CONCERTS_backup(ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE DATE,CITY VARCHAR(255),STATE VARCHAR(255),VENUE VARCHAR(255));
INSERT INTO CONCERTS_backup SELECT ID,DATE,CITY,STATE,VENUE FROM CONCERTS;
DROP TABLE IF EXISTS CONCERTS;
CREATE TABLE CONCERTS(ID INTEGER PRIMARY KEY AUTOINCREMENT,DATE DATE,CITY VARCHAR(255),STATE VARCHAR(255),VENUE VARCHAR(255));
INSERT INTO CONCERTS SELECT ID,DATE,CITY,STATE,VENUE FROM CONCERTS_backup;
DROP TABLE IF EXISTS CONCERTS_backup;

DROP TABLE IF EXISTS TICKET_HOLDERS;
CREATE TABLE IF NOT EXISTS TICKET_HOLDERS (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
EMAIL VARCHAR(255)
);
INSERT INTO TICKET_HOLDERS VALUES (NULL, ‘Jessica’, ‘Rodgers’, ‘jessrodg23@hotmail.com’);
INSERT INTO TICKET_HOLDERS VALUES (NULL, ‘Mary’, ‘O’Hara’, ‘mohara@gmail.com’);
INSERT INTO TICKET_HOLDERS VALUES (NULL, ‘Dominik’, ‘Smith’, ‘dsmith1120@aol.com’);
INSERT INTO TICKET_HOLDERS VALUES (NULL, ‘Marcella’, ‘Childs’, ‘mcchilds@gmail.com’);
SELECT * FROM TICKET_HOLDERS;

internettraveller May 28, 2022 6:16pm

Move on! If you need some extra sample code, ask me!

I use C# with System.Data.SQLite library and I got a foreign key mismatch error. I created three tables:

Com.CommandText = @"create table Projekt ([ProjectID] Integer NOT NULL Primary key, [Projektname] varchar(360),[ProjektEd] DATETIME, [ProjektLSD] Datetime, [ProjektLD] Datetime);";
Com.ExecuteNonQuery();
Com.CommandText= "create table Template ([TemplateID] Integer NOT NULL Primary key,[Templatename] varchar(360),[TemplateEd] Datetime, [TemplateLSD] Datetime,[TemplateLD] Datetime);";
Com.ExecuteNonQuery();
Com.CommandText = "create table Messung ([MessungID] Integer Not Null Primary Key, [Messungname] varchar(360), [MessungEd] Datetime, [MessungLSD] Datetime, [MessungLD] Datetime, [ProjektID] Integer, [TemplateID] Integer,FOREIGN KEY(ProjektID) REFERENCES Projekt(ProjektID), Foreign Key (TemplateID) References Template(TemplateID)); ";
Com.ExecuteNonQuery();

After that I insert this creates my first entry in the «Projekt» table:

Insert into projekt (Projektname, ProjektEd,ProjektLSD, ProjektLD) values ('Messung_Win_3', '2016-06-16 14:47:00','2016-06-27 14:47:00', '2016-07-14 11:12:00');

While this creates my fourth entry (I have another three inserts before this one) in the table «Template»:

Insert into Template (Templatename, TemplateEd, TemplateLSD, TemplateLD) values('Messung_Win_3', '2016-05-19 15:13:00','2016-06-27 14:47:00', '2016-07-14 11:12:00');

So now to the question: Why does this command have a foreign key mismatch error?

Com.CommandText = "Insert into Messung (Messungname, MessungEd, ProjektID, TemplateID) values ('Board2ROI3','2016-06-16 14:47:00',1,4);";

I testet it via SQLFiddle with the SQLite (SQL.js). Link is here: http://sqlfiddle.com/

There it worked perfectly fine but in C# it gets this error.

I hope you can help me

c# sqlite system.data.sqlite

What I have tried:

Created it inside SQLFiddle where it works perfectly fine

Это мой запрос на создание student_table

CREATE TABLE "student_table" (
    "student_id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name"  TEXT NOT NULL,
    "gender"    TEXT NOT NULL,
    "year_admited"  INTEGER
);

Это для моей таблицы года

CREATE TABLE "year_table" (
    "year"  INTEGER NOT NULL,
    "student_id"    INTEGER NOT NULL,
    "class" INTEGER NOT NULL,
    PRIMARY KEY("year"),
    FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
);

И это для terms_table

CREATE TABLE "terms_table" (
    "year"  INTEGER NOT NULL,
    "student_id"    INTEGER NOT NULL,
    "term"  INTEGER NOT NULL,
    "fees"  INTEGER,
    PRIMARY KEY("term","year"),
    FOREIGN KEY("year") REFERENCES "year_table"("year"),
    FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
);

Я успешно вставил строку в student_table и в year_table

Я попытался добавить значения в таблицу терминов

INSERT INTO "main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);

Но это дало эту ошибку

Error adding record. Message from database engine:

foreign key mismatch - "terms_table" referencing "year_table" (INSERT INTO 
"main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);)

Я использую браузер dB для SQLite

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

1 ответ

Лучший ответ

Из обязательных и предлагаемых индексов базы данных:

Обычно родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны совместно подчиняться ограничению UNIQUE или иметь индекс UNIQUE.

То, что вы делаете неправильно в своем коде, содержится в инструкции CREATE для terms_table:

FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")

Где вы определяете столбец student_id для ссылки на столбец student_id в year_table, для которого нет ограничения или индекса UNIQUE.
Столбец student_id в year_table просто ссылается на столбец student_id в student_table.

Что вы можете сделать, так это определить столбец student_id из terms_table для ссылки на столбец student_id в student_table, что имеет смысл:

FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")

См. демонстрацию.


0

forpas
10 Ноя 2020 в 19:39

Вопрос:

Я уже проверил этот вопрос и подумал, что у меня есть ответ, но потом это выглядело не так.

У меня есть следующий пример:

CREATE TABLE pipelines (
name VARCHAR NOT NULL,
owner VARCHAR NOT NULL,
description VARCHAR,
PRIMARY KEY (name, owner),
FOREIGN KEY(owner) REFERENCES user (id)
);
CREATE TABLE tasks (
id INTEGER NOT NULL,
title VARCHAR,
pipeline VARCHAR,
owner VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(pipeline) REFERENCES pipelines (name),
FOREIGN KEY(owner) REFERENCES pipelines (owner)
);
CREATE TABLE user (
id VARCHAR NOT NULL,
name VARCHAR,
password VARCHAR,
PRIMARY KEY (id)
);
pragma foreign_keys=on;

insert into user values ('wayne', '', '');
insert into pipelines values ('pipey', 'wayne', '');
insert into tasks values (1, 'hello', 'pipey', 'wayne');

При выполнении этого кода он выгружается:

$ sqlite3 foo.sq3 '.read mismatch.sql'
Error: near line 27: foreign key mismatch

Через список в вопросе, который я привел:

  • существует родительская таблица (пользователь).
  • существуют родительские столбцы (имя, владелец)
  • родительские столбцы – это, по сути, первичный ключ (я думал, что это было изначально)
  • дочерняя таблица ссылается на все столбцы первичного ключа в родительской таблице

И что в мире может вызвать эту ошибку?

Лучший ответ:

В документации говорится:

Обычно родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны быть совместно подчинены ограничению UNIQUE или иметь индекс UNIQUE.

В таблице pipelines ни столбцы name, ни столбцы owner сами по себе не уникальны.

Я думаю, вы действительно хотите иметь двухстоечный внешний ключ в таблице tasks:

FOREIGN KEY(pipeline, owner) REFERENCES pipelines(name, owner)

Это мой запрос на создание student_table

CREATE TABLE "student_table" (
    "student_id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name"  TEXT NOT NULL,
    "gender"    TEXT NOT NULL,
    "year_admited"  INTEGER
);

Это для моей таблицы года

CREATE TABLE "year_table" (
    "year"  INTEGER NOT NULL,
    "student_id"    INTEGER NOT NULL,
    "class" INTEGER NOT NULL,
    PRIMARY KEY("year"),
    FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")
);

И это для terms_table

CREATE TABLE "terms_table" (
    "year"  INTEGER NOT NULL,
    "student_id"    INTEGER NOT NULL,
    "term"  INTEGER NOT NULL,
    "fees"  INTEGER,
    PRIMARY KEY("term","year"),
    FOREIGN KEY("year") REFERENCES "year_table"("year"),
    FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")
);

Я успешно вставил строку в student_table и в year_table

Я попытался добавить значения в таблицу терминов

INSERT INTO "main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);

Но это дало эту ошибку

Error adding record. Message from database engine:

foreign key mismatch - "terms_table" referencing "year_table" (INSERT INTO 
"main"."terms_table"
("year", "student_id", "term", "fees")
VALUES (2020, 1, 1, 900000);)

Я использую браузер dB для SQLite

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

1 ответ

Лучший ответ

Из обязательных и предлагаемых индексов базы данных:

Обычно родительский ключ ограничения внешнего ключа является первичным ключом родительской таблицы. Если они не являются первичным ключом, то столбцы родительского ключа должны совместно подчиняться ограничению UNIQUE или иметь индекс UNIQUE.

То, что вы делаете неправильно в своем коде, содержится в инструкции CREATE для terms_table:

FOREIGN KEY("student_id") REFERENCES "year_table"("student_id")

Где вы определяете столбец student_id для ссылки на столбец student_id в year_table, для которого нет ограничения или индекса UNIQUE.
Столбец student_id в year_table просто ссылается на столбец student_id в student_table.

Что вы можете сделать, так это определить столбец student_id из terms_table для ссылки на столбец student_id в student_table, что имеет смысл:

FOREIGN KEY("student_id") REFERENCES "student_table"("student_id")

См. демонстрацию.


0

forpas
10 Ноя 2020 в 19:39

Понравилась статья? Поделить с друзьями:
  • Ошибка при подтверждении новой строки datatype mismatch
  • Ошибка при подключений к прослойке ncalayer что это
  • Ошибка при подтверждении накладной в егаис
  • Ошибка при подключении яндекс станции
  • Ошибка при подтверждении аккаунта гугл после сброса