Je suis un étudiant en informatique qui suit son premier cours sur les bases de données. J'utilise donc ici Postgresql pour créer une base de données avec les tables suivantes : employee, project et worksOn.

Donc, si vous exécutez le programme, vous pouvez voir que la table des employés et la table du projet sont créées.

Cependant, worksOn n'est pas parce qu'il me donne l'erreur suivante :

Erreur SQL [23503] : ERREUR : l'insertion ou la mise à jour sur la table "workson" viole la contrainte de clé étrangère "fk_employee"
Détail : clé (essn)=(222443333) n'est pas présente dans la table « employé »."

Je sais que les gens ne l'aimeront pas, mais si vous pouviez aider, ce serait très apprécié. De plus, tenez compte du fait que je n'ai jamais traité de bases de données et que j'ai passé une semaine là-dessus.

DROP TABLE IF EXISTS employee;
DROP TABLE IF EXISTS project;
DROP TABLE IF EXISTS worksOn;

create table employee(
    Ssn bigint generated always as identity,
    Fname varchar(45) not null,
    Lname varchar(45) not null,
    primary key(Ssn)
);

create table project(
    Pname varchar(45) not null,
    Plocation varchar(45) not null,
    Dnum int not null,  
    Pnumber int generated always as identity,
    primary key(Pnumber)
);

create table if not exists worksOn(
    Hours int not null,
    Essn bigint,
    Pno int,
--  index fk_emplyee,
    constraint fk_employee
        foreign key(Essn)
            references employee(Ssn)
            
--  constraint fk_project
--      foreign key(Pno)
--          references project(Pnumber)
--          on delete set null
);

insert into employee (Fname, Lname)
values('Jim', 'Brown');

--insert into project (Pname, Plocation, Dnum)
--values('ProjA', 'Boston', 3);

insert into worksOn (Essn, Pno, Hours)
values(222443333, 1, 20);
        
0
Emmanuel Kofy Agyapong 13 nov. 2020 à 11:17

1 réponse

Meilleure réponse

Votre colonne ssn est définie comme une colonne identity, ce qui signifie qu'elle est générée automatiquement chaque fois que vous ne spécifiez pas de valeur pour elle lors de l'insertion. Compte tenu de votre script SQL, la valeur SSN pour Jim Brown sera 1, et non 222443333 comme prévu.

Vous devez supprimer l'attribut identity de la colonne, puis le fournir lors de l'insertion dans la table des employés :

create table employee(
    ssn bigint,  --<< no identity!
    fname varchar(45) not null,
    lname varchar(45) not null,
    primary key(ssn)
);
....
....
insert into employee (ssn, fname, lname)
values(222443333, 'Jim', 'Brown');

Cependant, si vous veuillez que le SSN soit généré automatiquement, vous devez accéder à la dernière valeur lorsque vous l'insérez dans la table workson :

En supposant que employee.ssn soit toujours une colonne d'identité, vous pouvez utiliser ceci :

insert into employee (fname, lname)
values('Jim', 'Brown');

insert into project (pname, plocation, dnum)
values('ProjA', 'Boston', 3);

insert into workson (essn, pno, hours)
values(
   currval(pg_get_serial_sequence('employee', 'ssn')), 
   currval(pg_get_serial_sequence('project', 'number')), 20
);
0
a_horse_with_no_name 13 nov. 2020 à 08:32