MySQL error 1364

Signaler
Messages postés
16
Date d'inscription
mardi 12 janvier 2016
Statut
Membre
Dernière intervention
22 mai 2021
-
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
-
Bonjour,

Actuellement en projet de base de données sur MySQL Workbench, je tombe sur une erreur récurrente concernant mes ID (clés primaires).
Voici la création de mes tables :
DROP TABLE IF EXISTS Points_d_etapes;
CREATE TABLE Points_d_etapes(
idpoints_etapes Int Auto_increment NOT NULL ,
ville_depart_etape Varchar (50) DEFAULT NULL ,
ville_arrivee_etape Varchar (50) DEFAULT NULL ,
proportion_interville_intraville Varchar (50) DEFAULT NULL ,
ville_traversee Varchar (50) DEFAULT NULL
,CONSTRAINT Points_d_etapes_PK PRIMARY KEY (idpoints_etapes)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Tarif;
CREATE TABLE Tarif(
idtarif Int Auto_increment NOT NULL ,
prix_voyage Float NOT NULL
,CONSTRAINT Tarif_PK PRIMARY KEY (idtarif)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Billetterie;
CREATE TABLE Billeterie(
idbilletterie Int Auto_increment NOT NULL ,
prix_kilometrage Float NOT NULL ,
montant Float NOT NULL ,
`date` Date NOT NULL ,
`mode` Varchar (10) NOT NULL ,
division_paiement Bool NOT NULL COMMENT "payer en plusieurs fois, le client doit choisir." ,
idtarif Int NOT NULL
,CONSTRAINT Billeterie_PK PRIMARY KEY (idbilletterie)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS voyage;
CREATE TABLE voyage(
idvoyage Int Auto_increment NOT NULL ,
ville_depart Varchar (50) NOT NULL ,
date_depart Date NOT NULL ,
heure_depart Time NOT NULL ,
ville_arrivee Varchar (50) NOT NULL ,
date_arrivee Date NOT NULL ,
heure_arrivee Time NOT NULL ,
moyens_transport Varchar (50) NOT NULL ,
idtarif Int NOT NULL
,CONSTRAINT voyage_PK PRIMARY KEY (idvoyage)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS `Client`;
CREATE TABLE `Client`(
idclients Int Auto_increment NOT NULL ,
prenom_clients Varchar (20) NOT NULL ,
nom_clients Varchar (20) NOT NULL ,
telephone_clients Varchar (10) NOT NULL ,
mail_clients Varchar (50) NOT NULL ,
idadresse Int NOT NULL
,CONSTRAINT Client_PK PRIMARY KEY (idclients)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Personnel;
CREATE TABLE Personnel(
idpersonnel Int Auto_increment NOT NULL ,
nom_personnel Varchar (20) NOT NULL ,
prenom_personnel Varchar (50) NOT NULL ,
telephone_personnel Varchar (10) NOT NULL ,
mail_entreprise_personnel Varchar (50) NOT NULL ,
date_embauche Date NOT NULL ,
idadresse Int NOT NULL
,CONSTRAINT Personnel_PK PRIMARY KEY (idpersonnel)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Adresse;
CREATE TABLE Adresse(
idadresse Int Auto_increment NOT NULL,
numero Varchar (5) NOT NULL ,
nom_rue Varchar (50) NOT NULL ,
nom_residence Varchar (50) DEFAULT NULL ,
nom_batiment Varchar (50) DEFAULT NULL ,
etage Int DEFAULT NULL ,
code_postal Varchar (5) NOT NULL ,
ville Varchar (50) NOT NULL ,
`precision` Varchar (50) DEFAULT NULL ,
idclients Int NOT NULL ,
idpersonnel Int NOT NULL
,CONSTRAINT Adresse_PK PRIMARY KEY (idadresse)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS Commande;
CREATE TABLE Commande(
IDcommande Int Auto_increment NOT NULL ,
date_commande Date NOT NULL ,
idadresse Int NOT NULL ,
idclients Int NOT NULL
,CONSTRAINT Commande_PK PRIMARY KEY (IDcommande)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS determiner;
CREATE TABLE determiner(
idpoints_etapes Int NOT NULL ,
idpersonnel Int NOT NULL ,
idvoyage Int NOT NULL ,
kilometrage Float NOT NULL
,CONSTRAINT determiner_PK PRIMARY KEY (idpoints_etapes,idpersonnel,idvoyage)
)ENGINE=InnoDB;

DROP TABLE IF EXISTS choisir;
CREATE TABLE choisir(
idvoyage Int NOT NULL ,
idclients Int NOT NULL
,CONSTRAINT choisir_PK PRIMARY KEY (idvoyage,idclients)
)ENGINE=InnoDB;


ALTER TABLE Billeterie
ADD CONSTRAINT Billeterie_Tarif0_FK
FOREIGN KEY (idtarif)
REFERENCES Tarif(idtarif);

ALTER TABLE voyage
ADD CONSTRAINT voyage_Tarif0_FK
FOREIGN KEY (idtarif)
REFERENCES Tarif(idtarif);

ALTER TABLE Client
ADD CONSTRAINT Client_Adresse0_FK
FOREIGN KEY (idadresse)
REFERENCES Adresse(idadresse);

ALTER TABLE Client
ADD CONSTRAINT Client_Adresse0_AK
UNIQUE (idadresse);

ALTER TABLE Personnel
ADD CONSTRAINT Personnel_Adresse0_FK
FOREIGN KEY (idadresse)
REFERENCES Adresse(idadresse);

ALTER TABLE Personnel
ADD CONSTRAINT Personnel_Adresse0_AK
UNIQUE (idadresse);

ALTER TABLE Adresse
ADD CONSTRAINT Adresse_Client0_FK
FOREIGN KEY (idclients)
REFERENCES Client(idclients);

ALTER TABLE Adresse
ADD CONSTRAINT Adresse_Personnel1_FK
FOREIGN KEY (idpersonnel)
REFERENCES Personnel(idpersonnel);

ALTER TABLE Adresse
ADD CONSTRAINT Adresse_Client0_AK
UNIQUE (idclients);

ALTER TABLE Adresse
ADD CONSTRAINT Adresse_Personnel1_AK
UNIQUE (idpersonnel);

ALTER TABLE Commande
ADD CONSTRAINT Commande_Adresse0_FK
FOREIGN KEY (idadresse)
REFERENCES Adresse(idadresse);

ALTER TABLE Commande
ADD CONSTRAINT Commande_Client1_FK
FOREIGN KEY (idclients)
REFERENCES Client(idclients);

ALTER TABLE determiner
ADD CONSTRAINT determiner_Points_d_etapes0_FK
FOREIGN KEY (idpoints_etapes)
REFERENCES Points_d_etapes(idpoints_etapes);

ALTER TABLE determiner
ADD CONSTRAINT determiner_Personnel1_FK
FOREIGN KEY (idpersonnel)
REFERENCES Personnel(idpersonnel);

ALTER TABLE determiner
ADD CONSTRAINT determiner_voyage2_FK
FOREIGN KEY (idvoyage)
REFERENCES voyage(idvoyage);

ALTER TABLE choisir
ADD CONSTRAINT choisir_voyage0_FK
FOREIGN KEY (idvoyage)
REFERENCES voyage(idvoyage);

ALTER TABLE choisir
ADD CONSTRAINT choisir_Client1_FK
FOREIGN KEY (idclients)
REFERENCES Client(idclients);

RENAME TABLE billeterie TO billetterie;

ALTER TABLE `client` ADD sexe_client varchar (20) NOT NULL;

ALTER TABLE `client` ADD date_naissance_client date NOT NULL;


Suivi de ma requête :
DROP PROCEDURE IF EXISTS SF_GC_01;
Delimiter //
CREATE PROCEDURE SF_GC_01
(
prenom_cp VARCHAR(20), nom_cp VARCHAR(20), tel_cp VARCHAR(10), mail_cp VARCHAR(50), sexe_cp VARCHAR(20), date_naissance_cp DATE,

numero_p VARCHAR(5), rue_p VARCHAR(50), nom_residence_p VARCHAR(50), nom_batiment_p VARCHAR(50), etage_p INT, code_postal_p VARCHAR(5), ville_p VARCHAR(50), precision_p VARCHAR(50),

numero_fp VARCHAR(5), rue_fp VARCHAR(50), nom_residence_fp VARCHAR(50), nom_batiment_fp VARCHAR(50), etage_fp INT, code_postal_fp VARCHAR(5), ville_fp VARCHAR(50), precision_fp VARCHAR(50)
)

BEGIN
INSERT INTO Client (prenom_clients, nom_clients, telephone_clients, mail_clients, sexe_client, date_naissance_client) VALUES (prenom_cp, nom_cp, tel_cp, mail_cp, sexe_cp, date_naissance_cp);
INSERT INTO Adresse (numero, nom_rue, nom_residence, nom_batiment, etage, code_postal, ville, `precision`) VALUES (idadresse_p, numero_p, rue_p, nom_residence_p, nom_batiment_p, etage_p, code_postal_p, ville_p, precision_p);
INSERT INTO Adresse (numero, nom_rue, nom_residence, nom_batiment, etage, code_postal, ville, `precision`) VALUES (idadresse_p, numero_fp, rue_fp, nom_residence_fp, nom_batiment_fp, etage_fp, code_postal_fp, ville_fp, precision_fp);
END //
DELIMITER ;


CALL SF_GC_01("Lucas", "Dumont", "0781598694", "lucas.dumont1@viacesi.fr", "Homme", '2002-12-13', "4", "Rue de la vieille ville", NULL, NULL, NULL, "62123", "Simencourt", NULL, "4", "Rue de la vieille ville", NULL, NULL, NULL, "62123", "Simencourt", NULL)


Voici l'erreur qui m'ai retourné :
Error Code : 1364. Field 'idadresse' doesn't have a default value.

Merci pour votre aide, Bonne soirée


Configuration: Windows / Opera 75.0.3969.259

5 réponses

Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
Bonjour

Qu'est-ce que tu ne comprends pas ?
Dans certaines de tes tables le champ en question est défini comme ne pouvant pas être nul par contre tu n'y a pas précisé une valeur par défaut.
Cela implique que lorsque tu fais des insertion dans cette table tu dois obligatoirement soit mettre une valeur nulle pour ce champ soit une valeur tout court mais tu ne peux pas ne pas préciser le champ dans tes requêtes insert...
Messages postés
16
Date d'inscription
mardi 12 janvier 2016
Statut
Membre
Dernière intervention
22 mai 2021

Bonsoir,

Ces champs sont non nulles de base, mais il s'agit d'ID et donc de clés primaires (et étrangères si on parle d'une table liées), donc mon auto_increment devrait appliquer une valeur automatiquement à mon ID lorsque je crée un enregistrement
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
et il devine comment à quel ID il doit se rattacher ?
par exemple ... quand tu créés un CLIENT ... comment il choisi à quel ADRESSE il doit se lier ?
Messages postés
16
Date d'inscription
mardi 12 janvier 2016
Statut
Membre
Dernière intervention
22 mai 2021

Dans mon premier code, je précise dans un ALTER TABLE de la table client que idadresse est une foreign key provenant de la table adresse :
ALTER TABLE Client
ADD CONSTRAINT Client_Adresse0_FK
FOREIGN KEY (idadresse)
REFERENCES Adresse(idadresse);
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
Oui et.. ?
Si il y a plusieurs adresses dans ta table adresse.. il choisi laquelle ?
Messages postés
16
Date d'inscription
mardi 12 janvier 2016
Statut
Membre
Dernière intervention
22 mai 2021

J'en ai parlé avec plusieurs personnes et j'ai un nouveau problème. Lorsque je crée un client et une adresse dans leurs tables respectives (donc avec des ID qui leur sont attribuées), les ID correspondants sont censé s'inscrire dans une table "possèder" afin de les lier. Le code se présente comme ceci :
CREATE TABLE posseder(
idadresse Int NOT NULL ,
idpersonnes Int NOT NULL
,CONSTRAINT posseder_PK PRIMARY KEY (idadresse,idpersonnes)

,CONSTRAINT posseder_Adresse_FK FOREIGN KEY (idadresse) REFERENCES Adresse(idadresse)
,CONSTRAINT posseder_Personne0_FK FOREIGN KEY (idpersonnes) REFERENCES Personne(idpersonnes)
)ENGINE=InnoDB;

Or lorsque je rajoute des données dans Adresse et Client, les ID ne se crée pas dans la table possèder et je ne sais pas comment l' "actualiser" ?
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
Encore une fois... les foreign key.. ce n'est pas magique.... ce n'est pas "automatique" ...

Lorsque tu créés un client ... tu dois récupérer l'id qui a été généré
idem avec l'adresse
Ensuite, tu pourras faire un insert de ces deux id dans ta table "poosseder"
Messages postés
16
Date d'inscription
mardi 12 janvier 2016
Statut
Membre
Dernière intervention
22 mai 2021

Justement, lorsque je veux les insérer manuellement, j'ai une erreur de violation de clé étrangères, alors que je sélectionne bien les ID correspondants.
Messages postés
32980
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 juin 2021
3 560
Je pense que tu as trop de contraintes sur tes tables et qu'elles se marchent dessus....
Revois ton schéma et ne mets pas des Foreign Key ou des Contraintes dans tous les sens...
*