Comment utiliser un auto incrémenté de clé primaire clé étrangère?
C'est ce que j'essaie de faire:
J'ai 2 tables...
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`parent_id` int(11) DEFAULT NULL,
`related_ids` int(11) DEFAULT NULL,
KEY `parent_id` (`parent_id`),
KEY `related_ids` (`related_ids`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Puis une contrainte:
ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`);
Comme vous pouvez le voir la table parent a une auto-incrémenté clé primaire "id" est également utilisé en tant que clé étrangère pour la table enfant.
Maintenant, je veux insérer un enregistrement dans la table parent, comme ceci:
INSERT INTO parent SET DATA="abc";
Et il échoue avec l'erreur:
Ne peut pas ajouter ou mettre à jour une ligne enfant: un
contrainte de clé étrangère échoue
(myschema
.parent
, CONTRAINTE
parent_ibfk_1
CLÉ ÉTRANGÈRE (id
)
RÉFÉRENCESchild
(parent_id
))
Je comprends qu'il échoue parce qu'il ne trouve pas une visée d'enregistrement dans la table enfant. Si je commence par créer un enregistrement dans la table enfant, ensemble c'est parent_id à 1, puis de réinitialiser l'auto-incrémentation du compteur de la table parent (de sorte que la prochaine plaquette id = 1), il fonctionne! Mais ce n'est pas une solution.
Je ne vois pas l'utilité de l'insert de blocage si il n'y a aucune ligne dans la table enfant...
Je suis juste essayer de faire un un-à-plusieurs de la relation...
(Je sais que je peux utiliser les REJOINDRE, mais je suis en train d'utiliser le tableau des relations, de l'intégrité des données et également sous la forme de métadonnées pour PHP)
OriginalL'auteur Rolf | 2010-08-23
Vous devez vous connecter pour publier un commentaire.
Il semble que vous avez le référencement et de tables de référence dans le sens inverse. Vous voudrez peut-être faire:
Vous pouvez également définir la clé étrangère dans la
CREATE TABLE
déclaration, comme suit:Cas de Test:
Merci pour la réponse rapide. Je viens de réaliser que moi-même!
J'ai déjà défini l'identité dans SQL server 2012, mais je suis en train de passer de la valeur de db. Donc, à cet endroit( auto-incrémenté) que dois-je passer??
Ok, obtenu que. Mais comment cela pourrait-il être résolu lors de la création de tables avec un one-to-one relation, et vous souhaitez utiliser un
ON DELETE CASCADE
de sorte que lorsque le enfants est supprimé, le parent est supprimé? Ou même les deux sens (si l'enfant est supprimé, le parent est supprimé; si le parent est supprimé, l'enfant est supprimé). J'imagine qu'il n'est pas possible avec les contraintes de clés étrangères, et de les utiliser avec un one-to-one relation de table n'a pas de sens.OriginalL'auteur Daniel Vassallo
Euh... je crois que je l'ai eu en arrière.
Il semble que j'ai besoin d'ajouter la clé étrangère de la table enfant, comme ça:
Je vais avoir un moment difficile de traiter avec MySQL terminologie. Pouvez-vous me blâmer?
child
la table, car leparent
domaine de lachild
table sera contraint d'accepter une valeur que si cette valeur existe dans leid
colonne de laparent
table.OriginalL'auteur Rolf