0
votes

La valeur d'identification nécessite une valeur par défaut en fonction de l'erreur 1364?

Je veux créer deux tables. 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.

Je suis confus. Je pensais que 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>

ERREUR: 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;


2 commentaires

Vous définissez "Continuated_ID" sur INT NON NULL . C'est le comportement attendu. Voulez-vous ajouter int auto_incrènement non null ?


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 est AI, la pourquoi ne pas faire quelque chose comme continue_id int auto_incrètent la clé primaire non null, au lieu de continue_id int auto_incrènement, clé étrangère ( continue_id) Références Pratique (user_id) ? 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.


3 Réponses :


1
votes

Votre table Suite a une clé étrangère continue_id dans le tableau pratique , ce champ est donc obligatoire. xxx


0 commentaires

1
votes

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'


0 commentaires

0
votes

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');


1 commentaires

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