Je veux créer deux tables. Je suis confus. Je pensais que ERREUR: P> pratique code> a un
auto_incrènement code> pièce jointe et est une clé primaire
code>.
Suite CODE> a l'entité ID
Continuated_ID code> qui existe comme une clé étrangère code> que références
pratique (user_id) code>. MySQL exécute le code ci-dessous bien jusqu'à la ligne 19, où je reçois l'erreur 1364, indiquant que
continue_id code> n'a pas de valeur par défaut.
user_id code>, quel auto_increments, et étant le PK, aurait une valeur déterminante de 1,2,3 ... Je pensais que
continue_id code> est équivalent à user_id code>, et donc sa valeur par défaut est 1? Peut-être que je suis mal compris la manière dont les PK et FK fonctionnent réellement dans SQL? P>
CREATE TABLE practice(
user_id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
user_name VARCHAR(60) NOT NULL,
user_real_name VARCHAR(60) NOT NULL
);
CREATE TABLE continued(
continued_id INT NOT NULL,
FOREIGN KEY(continued_id)REFERENCES practice(user_id),
hobby VARCHAR(25) NOT NULL
);
INSERT INTO practice(user_name,user_real_name)
VALUES("KittenKing","Henry");
INSERT INTO practice(user_name,user_real_name)
VALUES("DogDictator","Mary");
INSERT INTO practice(user_name,user_real_name)
VALUES("HamsterHam","Denver");
INSERT INTO continued(hobby)
VALUES("Tennis");
INSERT INTO continued(hobby)
VALUES("Hockey");
INSERT INTO continued(hobby)
VALUES("Spear Hunting");
SELECT * FROM practice,continued;
3 Réponses :
Votre table Suite code> a une clé étrangère
continue_id code> dans le tableau
pratique code>, ce champ est donc obligatoire.
Vos inserts dans Suite CODE> doivent être liés à une entrée dans
Pratiquent code>. Vous pouvez soit faire cela en suivant immédiatement l'insertion dans
pratique code> avec un insert dans
poursuivi code> à l'aide de
last_insert_id () code> pour
Continué_id code >:
INSERT INTO continued (continued_id, hobby)
SELECT user_id, 'Spear Hunting'
FROM practice
WHERE user_name = 'HamsterHam'
Le ID code> pour
Continuré code> doit être le dernier identifiant inséré pour la pratique. En supposant que vous voulez un passe-temps par pratique, je vous recommanderais:
INSERT INTO practice (user_name, user_real_name)
VALUES('KittenKing', 'Henry');
INSERT INTO continued (continued_id, hobby)
VALUES(LAST_INSERT_ID(), 'Tennis');
INSERT INTO practice(user_name, user_real_name)
VALUES('DogDictator', 'Mary');
INSERT INTO continued (hobby)
VALUES (LAST_INSERT_ID(), 'Hockey');
INSERT INTO practice(user_name ,user_real_name)
VALUES('HamsterHam', 'Denver');
INSERT INTO continued (continued_id, hobby)
VALUES (LAST_INSERT_ID(), 'Spear Hunting');
Cela a abouti à: 17:38:30 Insérer dans les valeurs continues (continue_id, passe-temps) (last_inserted_id (), "Tennis") Code d'erreur: 1305. Fonction Pratique.Last_inserted_ID n'existe pas 0.000 sec code>
Vous définissez "Continuated_ID" sur
INT NON NULL code>. C'est le comportement attendu. Voulez-vous ajouter
int auto_incrènement non null code>?
Cela a abouti au résultat souhaité. Pouvez-vous expliquer pourquoi j'ai besoin d'écrire Auto_Increment deux fois? Je pensais que le but d'une clé étrangère est d'apporter des données d'une rangée de table à une autre. Si je dois exprimer que
continue_id code> est AI, la pourquoi ne pas faire quelque chose comme
continue_id int auto_incrètent la clé primaire non null, code> au lieu de
continue_id int auto_incrènement, clé étrangère ( continue_id) Références Pratique (user_id) code>? En d'autres termes, quel est le point d'avoir ce FK si j'ai besoin de reformuler que c'est un int cet auto_incrètent? Merci.