2010-01-10 4 views
1

Tenir compte des tableaux suivants pour un LMS:mySQL DB: effectuer des entrées simultanées?

Item ( 
     ID BIGINT NOT NULL UNIQUE AUTO_INCREMENT, 
     ConnectLog BIGINT NOT NULL, 
     ItemClass BIGINT NOT NULL, 
     ItemType BIGINT NOT NULL, 
     AcqDate TIMESTAMP NOT NULL DEFAULT NOW(), 
     Vendor BIGINT NOT NULL, 
     Cost DECIMAL(64,2) NOT NULL DEFAULT '0.00', 
     Image VARCHAR(255), 
     Access INTEGER NOT NULL, 
     Notes VARCHAR(255), 
     PRIMARY KEY (ID) 
    ) 

Book ( 
     ID BIGINT NOT NULL UNIQUE AUTO_INCREMENT, 
     Item BIGINT NOT NULL UNIQUE, 
     ISBN BIGINT, 
     Title VARCHAR(255) NOT NULL, 
     Authors VARCHAR(255), 
     Publisher VARCHAR(255), 
     DDC VARCHAR(255), 
     PubDate DATETIME, 
     Edition VARCHAR(255), 
     BookCase VARCHAR(255), 
     Shelf VARCHAR(255), 
     PRIMARY KEY (ID) 
    ) 

Désormais, lorsqu'un utilisateur fait une entrée pour Book, d'abord une entrée pour Item doit d'abord être créé. Mais je dois trouver le ID pour l'entrée Item qui a été créé afin que je puisse utiliser cette valeur pour Item dans le tableau Book ...

Comment? :/

Répondre

4

Utilisez mysql_insert_id()

// Create Entry 
$sql = "INSERT INTO TABLE() VALUES()"; 
mysql_query($sql); 
$id = mysql_insert_id(); 

// Create Book 
$sql = "INSERT INTO TABLE (`Item_ID`) VALUES(".$id.")"; 
mysql_query($sql); 

Je parie qu'il ya une commande MySQL, vous pouvez utiliser pour le faire en une seule requête. Mais, cela fonctionne.

+0

Droite. Mais un doute: Sur une lourde charge, est-il possible qu'une autre entrée pour Item puisse être exécutée AVANT d'atteindre la requête 'insert into Book'? – Bojack

+0

Je ne suis pas positif à ce sujet, mais j'imagine que l'insert_id est retourné à PHP après la fin de l'instruction, puis PHP met en cache quelque part. Je doute un peu que cela se passe et fait une autre requête pour le savoir. C'est possible cependant. –

+0

Vous pourriez vouloir vérifier la documentation, je l'ai parcourue mais je n'ai pas trouvé grand-chose. http://us2.php.net/mysql_insert_id –

0

Selon this link, vous pouvez faire une requête SQL comme:

INSERT INTO foo (auto,text) VALUES(NULL,'text'); # generate ID by inserting NULL 
INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text'); # use ID in second table 

Je ne l'ai pas testé, mais il semble que LAST_INSERT_ID() contient le dernier ID Inséré, peu importe quelle table il était inséré dans.

Si vous êtes préoccupé par les charges lourdes et que LAST_INSERT_ID() ne contient pas l'ID de l'entrée appropriée, vous pouvez envelopper ces instructions SQL dans un transaction.

Questions connexes