2010-11-22 4 views
1

Je crois que la question a émergé comme mon irritation de faire deux fois plus de travail que je pourrais imaginer est nécessaire.La normalisation de base de données et le développement paresseux

J'accepte l'idée que je pourrais manquer d'expérience avec MySQL et PHP pour trouver une solution plus simple. Mon problème est que j'ai plusieurs tables (et j'ajouterais peut-être plus) et de celles-ci est une table parent, ne contenant que deux champs - un id (int) et un nom l'identifiant.

En ce moment, j'ai sept tables avec au moins 15 champs dans chacun. Chaque table a un champ, contenant l'identifiant que je peux lier à la table parente.

Il n'est pas nécessaire de remplir toutes ces données - il vous suffira de créer cette entrée dans la table parente. Pour les autres tableaux, j'ai des formulaires séparés.

Maintenant, ces formulaires sont faits pour mettre à jour les données dans les champs, ce qui signifie que je dois extraire les données de la table si des données sont disponibles.

Ce que je voudrais faire est quand je reçois les données de mon formulaire, je pourrais juste utiliser une requête UPDATE dans mon modèle. Mais si la table que je veux mettre à jour n'a pas d'entrée pour cet identifiant spécifique, j'ai besoin de faire une insertion.

Donc, mon code actuel pseudo est comme ceci:

$sql = "SELECT id FROM table_x WHERE parent_id = ".$parent_id; 
$res = $mysql_query($sql); 
if(mysql_num_rows($res) == 1) 
{ 
    $sql = "UPDATE table_x SET ... WHERE parent_id = ".$parent_id; 
} 
else 
{ 
    $sql = "INSERT INTO table_x VALUES (...)"; 
} 
mysql_query($sql); 

J'ai deux font cela pour chaque table que j'ai - je peux faire quelque chose de différent ou plus intelligent ou est-ce juste la façon dont il doit être fait ? Parce que cela me semble très inefficace.

Répondre

4

Utilisez

INSERT ... ON DUPLICATE KEY UPDATE Syntax 

Il insérera si l'enregistrement ne se trouve pas,
autrement, il mettra à jour enregistrement existant,
et vous pouvez ignorer la vérification avant insertion - details

Cette relation supposant pour chaque 7 table à la table parente est 1: 1

+0

C'était exactement ce que je cherchais. – Repox

0
mysql_query("UPDATE table table_x ..... WHERE parent_id=".$parent_id); 
if (mysql_affected_rows()==0) { 
    mysql_query("INSERT INTO ....."); 
} 
+0

veuillez utiliser le formatage de code (j'ai corrigé cela). De plus, je pense que la solution «ON DUPLICATE KEY UPDATE» est beaucoup plus belle (et je suis sûr que c'est plus rapide). – oezi

0

dans MySQL, vous pouvez le faire:

INSERT INTO table 
    (
    col1, 
    col2 
) VALUES(
    'val1', 
    'val2' 
) ON DUPLICATE KEY UPDATE table SET 
    col2 = 'val2' 

un coup d'oeil à la documentation pour plus d'informations

2

Ou utiliser REPLACE au lieu de INSERT - c'est un insert, mais faire une SUPPRIMER puis INSERT lorsque une clé unique (telle que la clé primaire) est violée.

+0

J'aime l'idée, c'est pourquoi j'ai donné votre réponse un vote - mais sur DUPLICATE m'a amené à la souotion dont j'avais besoin. – Repox

+0

'ON DUPLICATE' est le chemin à parcourir, mais seulement disponible depuis MySQL 4.1.0 - mais vous devriez avoir une version supérieure maintenant :) – Konerak

Questions connexes