J'ai essayé de rechercher un moyen d'accéder à des insert
informations dans plusieurs tables dans la même requête, mais j'ai découvert que c'était impossible? Donc, je veux insert
en utilisant simplement plusieurs requêtes ie;
INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')
Mais comment puis-je donner l'incrémentation automatique id
du users
au "manuel" userid
pour la profile
table?
Réponses:
Non, vous ne pouvez pas insérer dans plusieurs tables en une seule commande MySQL. Vous pouvez cependant utiliser des transactions.
Jetez un œil à
LAST_INSERT_ID()
pour réutiliser les valeurs d'auto-incrémentation.Edit: vous avez dit " Après tout ce temps à essayer de le comprendre, cela ne fonctionne toujours pas. Ne puis-je pas simplement mettre l'ID qui vient d'être généré dans un $ var et mettre ce $ var dans toutes les commandes MySQL? "
Laissez-moi élaborer: il y a 3 façons possibles ici:
Dans le code que vous voyez ci-dessus. Cela fait tout dans MySQL, et
LAST_INSERT_ID()
dans la deuxième instruction sera automatiquement la valeur de la colonne d'auto-incrémentation qui a été insérée dans la première instruction.Malheureusement, lorsque la deuxième instruction elle-même insère des lignes dans une table avec une colonne auto-incrémentée, la
LAST_INSERT_ID()
sera mise à jour avec celle de la table 2, et non la table 1. Si vous avez toujours besoin de celle de la table 1 par la suite, nous devrons la stocker dans une variable. Cela nous amène aux voies 2 et 3:Stockera le
LAST_INSERT_ID()
dans une variable MySQL:Stockera le
LAST_INSERT_ID()
dans une variable php (ou dans toute langue pouvant se connecter à une base de données, de votre choix):INSERT ...
LAST_INSERT_ID()
, soit en exécutant cette instruction littérale dans MySQL, soit en utilisant par exemple phpmysql_insert_id()
qui le fait pour vousINSERT [use your php variable here]
AVERTISSEMENT
Quelle que soit la manière de résoudre ce problème que vous choisissez, vous devez décider de ce qui doit se passer si l'exécution est interrompue entre les requêtes (par exemple, votre serveur de base de données tombe en panne). Si vous pouvez vivre avec "certains ont fini, d'autres non", ne poursuivez pas votre lecture.
Si toutefois vous décidez "soit toutes les requêtes se terminent, soit aucune ne se termine - je ne veux pas de lignes dans certaines tables mais pas de lignes correspondantes dans d'autres, je veux toujours que mes tables de base de données soient cohérentes", vous devez envelopper toutes les instructions dans une transaction. C'est pourquoi j'ai utilisé le
BEGIN
etCOMMIT
ici.Commentez à nouveau si vous avez besoin de plus d'informations :)
la source
@mysql_variables
en conjonction avec des instructions préparées?assez simple si vous utilisez des procédures stockées:
script complet:
la source
Que se passerait-il si vous souhaitiez créer de nombreux enregistrements de ce type (pour enregistrer 10 utilisateurs, pas un seul)? Je trouve la solution suivante (seulement 5 requêtes):
Étape I: Créez une table temporaire pour stocker de nouvelles données.
Ensuite, remplissez ce tableau avec des valeurs.
Ici, au lieu de
$ALL_VAL
vous placez une liste de valeurs: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Étape II: envoyer les données à la table «utilisateur».
Ici, "IGNORE" peut être utilisé, si vous autorisez déjà certains utilisateurs à être à l'intérieur. En option, vous pouvez utiliser UPDATE similaire à l'étape III, avant cette étape, pour trouver les utilisateurs déjà à l'intérieur (et les marquer dans la table tmp). Ici, nous supposons que le nom d'utilisateur est déclaré comme
PRIMARY
dans la table des utilisateurs.Étape III: appliquez la mise à jour pour lire tous les identifiants d'utilisateurs des utilisateurs à la table tmp. CECI EST UNE ÉTAPE ESSENTIELLE.
Étape IV: créer une autre table en utilisant l'ID de lecture pour les utilisateurs
la source
essaye ça
Références
PHP
MYSQL
la source
jetez un œil à mysql_insert_id ()
ici la documentation: http://in.php.net/manual/en/function.mysql-insert-id.php
la source
LAST_INSERT_ID()
le programmeur?C'est la façon dont je l'ai fait pour un projet uni, fonctionne bien, probablement pas en sécurité tho
}
la source
Juste une remarque sur ton dicton
Mangez-vous tous vos plats du midi mélangés à des boissons dans le même bol?
Je suppose - non.
Pareil ici.
Il y a des choses que nous faisons séparément.
2 requêtes d'insertion sont 2 requêtes d'insertion. C'est bon. Rien de mal à cela. Pas besoin de l'écraser en un.
Idem pour select. La requête doit être sensée et faire son travail. Voilà les seules raisons. Le nombre de requêtes ne l'est pas.
En ce qui concerne les transactions - vous pouvez les utiliser, mais ce n'est pas si grave pour le site Web moyen. S'il arrivait une fois par an (le cas échéant) qu'un enregistrement d'utilisateur soit interrompu, vous pourrez le réparer, sans aucun doute.
il existe des centaines de milliers de sites exécutant mysql sans pilote de prise en charge des transactions. Avez-vous entendu parler de terribles catastrophes qui ont brisé ces sites? Moi non plus.
Et mysql_insert_id () n'a rien à voir avec les transactions. vous pouvez inclure dans la transaction tout droit. c'est juste des questions différentes. Quelqu'un a soulevé cette question de nulle part.
la source
That function is the devil of database consistency.
qui a fait cela, pas les transactions. Je ne vois rien de mal dans les transactions.Pour l'AOP, vous pouvez le faire
la source