2012-06-15 7 views
0

cette insertion échoue sur mon db -clés primaires et les clés étrangères conflit

insert into tig_pairs (pkey, pval, uid) select 'schema-version', '4.0', uid from tig_users where (sha1_user_id = sha1(lower('db-properties'))); 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`tigasedb`.`tig_pairs`, CONSTRAINT `tig_pairs_constr_2` FOREIGN KEY (`nid`) REFERENCES `tig_nodes` (`nid`)) 

Si les définitions de table sont:

create table if not exists tig_pairs (
    nid int unsigned, 
    uid int unsigned NOT NULL, 

    pkey varchar(255) NOT NULL,  
    pval mediumtext, 

    PRIMARY KEY (nid, pkey),  --  *** 
      key pkey (pkey), 
     key uid (uid), 
     key nid (nid), 
     constraint tig_pairs_constr_1 foreign key (uid) references tig_users (uid), 
     constraint tig_pairs_constr_2 foreign key (nid) references tig_nodes (nid) 
) 
ENGINE=InnoDB default character set utf8 ROW_FORMAT=DYNAMIC; 

et

create table if not exists tig_nodes (
    nid int unsigned NOT NULL auto_increment, 
    parent_nid int unsigned, 
    uid int unsigned NOT NULL, 

    node varchar(255) NOT NULL, 

    primary key (nid), 
    unique key tnode (parent_nid, uid, node), 
    key node (node), 
     key uid (uid), 
     key parent_nid (parent_nid), 
     constraint tig_nodes_constr foreign key (uid) references tig_users (uid) 
) 
ENGINE=InnoDB default character set utf8 ROW_FORMAT=DYNAMIC; 

La ligne PRIMARY KEY (nid, pkey), -- *** obtient omis, Ma requête passe très bien. Y a-t-il un conflit entre cette clé primaire et la contrainte troublante de la clé étrangère? Comment puis-je l'éviter? La clé primaire doit rester là :)

Merci!

EDIT: est débarrassé de l'erreur en modifiant la définition tig_pairs sur une ligne:

nid int unsigned NOT NULL auto_increment, 

Répondre

2

Vous avez une contrainte étrangère sur votre table tig_pairs référence à la table tig_nodes. Cependant, vous n'insérez aucune donnée dans le champ nid. Le champ référencé, tig_nodes.nid, n'autorise pas les valeurs NULL. En raison de ces deux contraintes, vous ne pouvez pas INSERT null dans le champ nid de tig_pairs.

Voir aussi cette question: MySQL foreign key to allow NULL?

Edit: aussi, les valeurs de clé primaire ne sont jamais autorisés à être NULL; Tant que nid est inclus dans cette clé primaire, vous ne pouvez pas le rendre NULL.

+0

+1. Très bonne explication – DonCallisto

+0

hum ... tache sur. Maintenant, pouvez-vous me donner des conseils sur la façon de contourner ce problème? Cette ligne est extra (c'est-à-dire n'était pas là comme le programmeur d'origine pensait tout) et il doit rester là. Si PKs ne peut pas être rendu nul, alors je suppose qu'il y a beaucoup de requêtes et de logique de serveur qui doit changer [gulp]. Des raccourcis? – kellogs

+0

Je ne sais pas exactement quel est le but des tables; mais sans en changer la structure .. vous pourriez être en mesure de mettre une valeur "par défaut" dans la table 'tig_nodes', et utiliser l'ID de cette valeur par défaut pour' nid' dans 'tig_pairs'? – Yhn

Questions connexes