2012-09-03 2 views
2

Je suis à la recherche de conseils et de pointeurs pour un petit projet que je fais. J'ai quelques idées mais je ne suis pas sûr que ce soit la meilleure pratique. J'utilise mysql et php.Insertion de clés étrangères et de clés primaires mysql dans une transaction.

J'ai une table appelée nomming dans la base de données.

Il a une clé primaire appelée identifiant de ligne qui est un nombre entier.

Ensuite, j'ai environ 8 autres tables faisant référence à cette table. Appelées nomplu, accsing, accplu, datsing, datplu par exemple. Chacun a une colonne qui fait référence à la clé primaire de la création. Avec mon code php j'ai toutes les informations à insérer dans les tables sauf une chose, la clé primaire de la table de nommage. Alors que PHP crée une série d'insertions comme suit.

INSERT INTO nomsing(word,postress,gender) VALUES (''велосипед","8","mask"). 
INSERT INTO nomplu(word,postress,NOMSING?REFERENCE) VALUES (''велосипеды","2",@the reference to the id of the first [email protected]). 

Il y a plus d'inserts mais celui-ci fait passer le point. Le second insert doit référencer l'identifiant généré automatiquement pour le premier insert. J'étais cela pour travailler comme une transaction de sorte que tous les insertions devraient être terminées ou pas. Une idée que j'ai est de ne pas générer automatiquement l'ID et de le générer moi-même en PHP. De cette façon, je connaîtrais l'identifiant donné avant la transaction, mais je devrais vérifier si l'identifiant était déjà dans la base de données.

Une autre idée que j'ai est de faire le premier insert, puis d'interroger l'identifiant de ligne de cet insert dans php, puis de faire le second insert. Je veux dire que les deux devraient fonctionner mais ils ne semblent pas être une solution optimale. Je ne connais pas très bien les fonctionnalités transactionnelles de la base de données, mais quelle serait la meilleure approche à adopter dans ce cas. Je n'aime pas l'idée d'insérer puis d'interroger l'ID puis d'exécuter le reste des requêtes. Juste semble très inefficace ou peut-être que je me trompe.

+0

vérifier cela: http://stackoverflow.com/questions/621369/sql-insert-and-catch-the-id-auto-increment-value – mostruash

+0

dans les transactions 'new.PK_field_name_in_inserted_table' retournera le dernier identifiant inséré pour le courant session. Vous pouvez donc l'utiliser dans des transactions créées manuellement. Je ne sais pas si c'est ce que tu veux mais j'espère que ça aide. En passant, il y a une erreur de syntaxe dans vos requêtes. – Leri

+0

Cela semble très bien. Je vous remercie. Savez-vous si cette fonction mysql_insert_id est thread-safe. Je veux dire si un utilisateur appelle l'insert, puis un autre à une fraction de seconde plus tard. Puis, lorsque le premier utilisateur appelle get ID, il obtient l'identifiant de l'insert du second utilisateur. – KennyBartMan

Répondre

1

Insérez simplement une ligne dans la table principale. Ensuite, vous pouvez récupérer le insert id (lastInserId lorsque vous êtes sur PDO) et l'utiliser pour remplir vos autres requêtes.

+0

Je suis un peu un noob. Qu'est-ce que PDO? – KennyBartMan

+0

Sur PHP, il y a 3 façons d'accéder aux données MySQL: mysql (obsolète) mysqli et PDO. PDO est votre choix préféré pour les nouveaux projets. – JvdBerg

+0

Cela semble être la bonne réponse. – KennyBartMan

0

Vous pouvez utiliser la version de php fournie par JvdBerg, ou LAST_INSERT_ID de Mysql. J'utilise habituellement l'ancienne option.

Voir une question SO similaire here.

0

Vous pouvez ajouter une nouvelle colonne à la table nomsing, appelée 'insert_order' (ou similaire) avec une valeur par défaut de 0, puis au lieu de générer une instruction SQL par insertion, créez une instruction d'insertion en bloc, par exemple.

INSERT INTO nomsing(word,postress,gender, insert_order) 
VALUES (''велосипед","8","mask",1), (''abcd'',"9","hat",2)..... 

vous créez le numéro insert_order avec un compteur dans votre boucle commençant à un. Ensuite, vous pouvez effectuer un SELECT sur la table pour obtenir les identifiants, par ex.

SELECT row_id 
FROM nomsing 
WHERE insert_order > 0; 

maintenant vous avez tous les ID que vous pouvez maintenant faire un insert en vrac pour vos requêtes suivantes. A la fin de votre script ne juste une mise à jour pour réinitialiser la colonne insert_order retour à 0

UPDATE nomsing SET insert_order = 0 WHERE insert_order > 0; 

Il peut sembler désordonné d'ajouter une colonne supplémentaire pour le faire, mais il ajoutera une augmentation significative de la vitesse sur l'exécution d'une requête à une fois.

Questions connexes