2009-02-06 9 views
1

J'ai une base de données SQL que j'utilise pour stocker des informations et chaque enregistrement a un identifiant unique généré par la base de données. Mon programme est écrit en flash et fonctionne sur le web, le programme fonctionne bien et il insère des enregistrements dans la base de données et tire l'idnumber du dernier enregistrement et l'affiche pour l'utilisateur, ma question est de savoir comment gérer plusieurs entrées simultanées parce que le programme sera utilisé par plusieurs utilisateurs et les chances sont, il y aura les insertions concurrentes dans la base de données alors comment pourrais-je être en mesure d'identifier les numéros d'identification uniques corrects pour les utilisateursProblème classique d'insertion de base de données

est ici le code à insérer dans la base de données

$query = "INSERT into $tablename (grade,school,country) VALUES ('$datarray[0]','$datarray[1]','$datarray[2]')"; 
$result = mysql_query($query) 
     or die("no rows selected"); 

et après je charge un autre fichier php sur le second dans mon fichier flash pour tirer l'ID de cet enregistrement et l'afficher ici est le code

$query = "SELECT max(id) from $tablename"; 
$result = mysql_query($query) 
     or die("no rows selected"); 
$row = mysql_fetch_array($result); // extracts one row 
echo "id=$row[0]"; 

Que dois-je faire pour obtenir l'ID correct pour cet enregistrement?

+0

Quel moteur de base de données? – kemiller2002

Répondre

4

PHP a mysql_insert_id() retourner

L'ID généré pour une AUTO_INCREMENT colonne par la requête précédente INSERT sur la réussite , 0 si la requête précédente ne pas générer une valeur AUTO_INCREMENT, ou FALSE si aucune La connexion MySQL a été établie à .

1

Si le code de votre base de données renvoie l'ID de la dernière ligne insérée, cela posera certainement des problèmes.

Si vous utilisez SQL Server, vous pouvez utiliser:

SELECT SCOPE_IDENTITY()

pour sélectionner de nouveau le code correct. Plus d'informations au MSDN article.

Il serait utile si vous avez donné plus d'informations sur la façon dont vous faites vos encarts de base de données et ce que la technologie que vous utilisez

+0

La question semble utiliser MySQL, pas MSSQL. – Powerlord

+0

Oui, je vois cela maintenant, n'était pas apparent quand il a demandé pour la première fois. –

2

Vous pouvez faire votre insertion et à la suite des opérations de sélection dans une même transaction. Vous pouvez également avoir accès aux services en fonction de votre base de données.

+0

Fusionner insérer et interroger dans un SP - qui facilite l'utilisation des transactions. – Arkadiy

-1

Vous pouvez associer des ID à des utilisateurs de sorte que la clé primaire de votre table soit composée (ID unique généré, ID utilisateur).

+0

Et si l'utilisateur a deux fenêtres ouvertes? –

+0

Cela dépend de la cause de l'insertion de la base de données. Si cela dépend de ce que l'utilisateur entre des données ajoutées à la base de données, alors avec 2 fenêtres ouvertes, cet utilisateur peut seulement insérer une ligne à la fois. Si ce n'est pas le cas, une meilleure solution pourrait être mise en œuvre. – Zabbala

+0

Je ne vois pas comment utiliser une clé composée aide ici.Si le problème consiste à récupérer correctement une clé, l'ajout d'une autre couche de complexité n'est pas vraiment la solution. –

1

Vous avez besoin d'un moyen atomique pour obtenir un identifiant unique pour votre insertion. Les manières classiques sont d'utiliser une séquence de base de données où vous interrogez la base de données pour le numéro unique suivant, puis utilisez ce nombre comme clé primaire lorsque vous insérez, ou (si vous utilisez MySQL qui génère le numéro unique sur insert) combinez l'insert et sélectionnez en une seule déclaration atomique.

+0

comment ferais-je cela puisque j'envoie et reçoit des variables via flash en utilisant php au milieu – hitek

0

transactions d'utilisation - et je ne voudrais pas écrire personaly en flash (mais c'est mon opionion personnelle). Malheureusement, je n'ai pas fait une telle chose en flash - donc je ne sais pas s'il y a un support de transaction de la langue - ce que vous pouvez faire est d'utiliser des transactions sur la base de données.Ce que je veux dire est pour chaque connexion que vous faites - vous ouvrez une transaction et dans cette transaction il n'y a qu'un seul utilisateur - donc vous avez l'id correct à afficher - mais si vous utilisez des numéros auto-incrémentés comme ids, vous aurez toujours le même problème - puisque les transactions peuvent s'exécuter simultanément. J'espère que cela aide un peu;)

3

La plupart des bases de données prennent en charge la clé UUID/GUID. Générez-le avec votre backend (ou même ActionScript) et utilisez-le dans la base de données. Ce n'est pas une clé naturelle, mais il est parfait pour l'unicité, même dans les fermes de serveurs.

0

Assurez-vous de mettre INSERT et instructions SELECT dans une requête unique qui insère les données et renvoie l'ID.

Il est important de ne pas utiliser deux requêtes distinctes pour récupérer l'ID car un premier utilisateur peut (et éventuellement) insérer un autre enregistrement avant d'avoir l'ID du premier.

Si vous utilisez des transactions séparées vous éventuellement avoir le scénario suivant:

User1 : Inserts a record (id = 123) 
User2 : Inserts a record (id = 124) 
User1 : Requests max id (and gets back 124) <---- WRONG ID 
User2 : Requests max id (and gets back 124) 

Comme il est indiqué dans les postes ci-dessus la syntaxe exacte pour récupérer l'ID inséré est spécifique DB.

0

Tout d'abord vous utilisez PHP et MySQL. Les colonnes d'ID doivent généralement être définies comme:

id int(4) UNSIGNED NOT NULL AUTO_INCREMENT, 
-- Constraints 
primary key (id) 

L'utilisation de id comme nom est auto-documentée. Un entier de 4 octets peut être excessif, d'autant plus qu'il n'est pas signé, mais l'espace est bon marché et il est très improbable que vous soyez à court d'identifiants.

Je suggère également d'utiliser le moteur InnoDB là où c'est possible. Les clés étrangères et l'intégrité des données sont des choses merveilleuses.

Votre script devrait faire un mysql_connect() et cela signifie que chaque utilisateur aura sa propre connexion à la base de données parce que la session de chaque utilisateur est une instance distincte de ce script. Après votre insertion, vous pouvez utiliser mysql_insert_id() comme l'affiche précédente indiquée pour obtenir l'identifiant qui a été généré pour l'insertion.

0
insert ....; select last_insert_id()