2014-06-23 6 views
1

Je travaille dans MySQL 5.5.MySQL - Mettre à jour un enregistrement et maintenir l'intégrité référentielle

J'ai une table de contacts comme celui-ci

CREATE TABLE Contacts ( ID INTEGER NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(255) NOT NULL, Institution VARCHAR(255), Address VARCHAR(255), Email VARCHAR(255) NOT NULL UNIQUE, Phone VARCHAR(10) ); et une tables de stocks comme celui-ci

CREATE TABLE Inventories ( ID INTEGER NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT, InventoryParametersID INTEGER NOT NULL UNIQUE, ContactID INTEGER NOT NULL, LocationID INTEGER NOT NULL, Year INTEGER, DateUploaded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Comments VARCHAR(255), FOREIGN KEY (ContactID) REFERENCES Contacts(ID) ); Dans mon formulaire en ligne, télécharger des contacts inventaires. Voici le comportement que je veux: - Lorsqu'un nouveau contact télécharge un inventaire, faites un insert avec ses nouvelles infos - Lorsqu'un contact existant (déterminé par adresse e-mail) télécharge un autre inventaire, mettez à jour ses informations ET conservez l'intégrité référentielle avec la table Inventories

Comment faire?

Voici ce que j'ai essayé:

CASE

FOREIGN KEY (ContactID) REFERENCES Contacts(ID) 

REPLACE INTO Contacts (`Name`, `Institution`, `Address`, `Email`, `Phone`) VALUES (?, ?, ?, ?, ?); 

RÉSULTAT

No change 

CASE

FOREIGN KEY (ContactID) REFERENCES Contacts(ID) 

    ON UPDATE CASCADE 

REPLACE INTO Contacts (`Name`, `Institution`, `Address`, `Email`, `Phone`) VALUES (?, ?, ?, ?, ?); 

RÉSULTAT

No change 
+1

A REMPLACER ligne et trouver supprime ajouter une nouvelle. Donc, votre UPCATE CASCADE ne fonctionne pas. Pourquoi n'utilisez-vous pas INSERT ... ON DUPLICATE KEY UPDATE? – lopo

+0

C'est ce sur quoi je travaille maintenant, mais j'ai de la difficulté à trouver la syntaxe. Avez-vous un lien vers un bon exemple autre que les docs MySQL? – benjsigmon

+1

INSERT INTO Contacts ('Nom',' Institution', 'Adresse',' Email', 'Téléphone') VALEURS (?,?,?,?,?) SUR LA MISE À JOUR DUPLICATE KEY Name = VALUES (NAME), Institution = VALEURS (Institution) ... [MySQL-DOC] (http://dev.mysql.com/doc/refman/5.5/fr/insert-on-duplicate.html) – lopo

Répondre

2

Une REPLACE supprime la ligne de recherche et en ajoute une nouvelle. Donc, votre UPCATE CASCADE ne fonctionne pas. Pourquoi n'utilisez-vous pas INSERT ... ON DUPLICATE KEY UPDATE?

INSERT INTO Contacts (Name, Institution, Address, Email, Phone) 
VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE 
Name = VALUES(NAME), 
Institution = VALUES(Institution) ... 

MySQL DOC

Questions connexes