2017-08-23 1 views
-1

Ich habe zwei Tabellen Benutzer und Pakete.Verwenden Sie Wert aus einer Tabelle in einer zweiten Tabelle

In Benutzer gibt es eine Spalte „Paket“ genannt und in Pakete eine Spalte „id“ bezeichnet.

Was ich versuche zu erreichen ist, wenn die Paket-ID in der Benutzertabelle geändert wird, sagen wir "1", dann sollte ein anderes Feld aus der Benutzertabelle "Speicher" in den entsprechenden "maxstorage" geändert werden "aus der Pakete Tabelle ... Eine kleine Abbildung hier:

Tables

DATABASE:

DB

sagen wir Joe möchte Upgrade Nummer 2. Th verpacken de sein Lagerungsbetrag sollte geändert werden, wenn sein Paket geändert wird. Es sollte den maxstorage aus der Packages-Tabelle in die Tabelle users ziehen und dann in der Spalte "storage" ...

Wie kann ich das erreichen?

Es ist ziemlich schwer für mich zu erklären, wenn jemand es dann bekommt, dann bearbeiten Sie für eine einfachere Erklärung.

Antwort

0

Was Sie wollen, ist in einer Abfrage nicht möglich (oder zumindest nicht einfach). Sie müssen diese Logik in Ihren Code verschieben, z. Sie haben eine Abfrage, die eine Zeile in der Benutzer Tabelle ändert. Aktualisieren Sie in dieser Abfrage auch den Speicher.

Noch besser, lassen Sie die user.storage_id vollständig. Gute Datenbanken wiederholen sich nicht. Sie haben bereits die Daten in den Paketen Tabelle, warum kopieren Sie es an die Benutzer?

SELECT users.name, packages.maxstorage 
FROM users 
LEFT JOIN packages ON (users.package_id = packages.id) 
+0

Was ist mit fremden Schlüsseln, könnten sie den Trick machen? –

+0

Vielleicht, ich bin nicht bekannt mit FK :) aber diese Abfrage sollte es tun. – Martijn

+0

Es gibt mehr Dinge in der Paket-Tabelle, zum Beispiel Verfallszeit und Name usw. Deshalb brauche ich es. –

0

Es kann sein, dass ich nicht deine Frage richtig verstanden, aber was ist das: (pls entsprechende Überlegungen auf Transaktionen machen Konflikte zu vermeiden).

CREATE TABLE P (ID INT, MAXSTORAGE INT); 
CREATE TABLE U (USR_ID INT, PACKAGE_ID INT, STORAGE INT); 

CREATE TRIGGER U_STORAGE_UPDATE BEFORE UPDATE ON U 
    FOR EACH ROW BEGIN 
    SET NEW.STORAGE = IF(NEW.PACKAGE_ID<>OLD.PACKAGE_ID , (SELECT MAXSTORAGE FROM P WHERE ID = NEW.PACKAGE_ID), NEW.STORAGE); 
    END; 

INSERT INTO P VALUES (1,12345); 
INSERT INTO P VALUES (2,54321); 

INSERT INTO U VALUES (1,1,12000); 
INSERT INTO U VALUES (2,2,60000); 

SELECT * FROM U; 

UPDATE U SET PACKAGE_ID=2 WHERE USR_ID=1; 

SELECT * FROM U; 

UPDATE U SET STORAGE=23 
WHERE USR_ID=1; 

SELECT * FROM U; 

DROP TABLE P; 
DROP TABLE U; 

Ausgang: ante

USR_ID PACKAGE_ID STORAGE 
1 1 1 12000 
2 2 2 60000 

Post 1. Update

USR_ID PACKAGE_ID STORAGE 
1 1 2 54321 
2 2 2 60000 

Post 2. Update

USR_ID PACKAGE_ID STORAGE 
1 1 2 23 
2 2 2 60000 
0

Ist die Frage nicht beantworten, aber vielleicht für Sie nützlich sein :

Die Spalte 'Paket' in Benutzer sollte eine Fremdschlüsseleinschränkung für 'ID' in Pakete haben. Dadurch wird sichergestellt, dass alle Daten in der Spalte "Paket" einem gültigen Wert in der Tabelle "Pakete" entsprechen. Andernfalls könnten Sie einige Daten in die Spalte 'Paket' eingeben, die keinen Wert in der Tabelle 'Pakete' enthält.

Verwandte Themen