hmm: SQL Query

Hi leute,

ich muss leider meine Datenbank komplett umkrempeln und habe jetzt Probleme mit einer Insertquery.

Meine neuen Tabellen haben folgende Form (ich benutze übrigens sqlite3):

create table user (user_id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT, anrede TEXT, vorname TEXT, nachname TEXT, passwort TEXT);
create table mitarbeiter (mitarbeiter_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT);
create table user_mitarbeiter (user_id INTEGER, mitarbeiter_id INTEGER);
create table mitarbeiter_skill (mitarbeiter_id INTEGER, skill TEXT, subskill TEXT, nivau TEXT,  PRIMARY KEY (mitarbeiter_id, skill, subskill));
create table team (team_id INTEGER PRIMARY KEY AUTOINCREMENT, team_name TEXT);
create table user_team (user_id INTEGER, team_id INTEGER, admin INTEGER, PRIMARY KEY (user_id, team_id));

Wenn sich jemanhd auf meiner Seite einloggt, so kann er diese Tabellen mit werten befüllen. Die eindeutige EMail des Users ist abrufbar per

req.session.email

Hat der User neue Daten eingetragen so werden die alten Daten des Users gelöscht und durch die Neuen ersetzt, dass sah bei meinen alten Tabellen so aus:

app.post('/saveSkillData', function(req, res) {
    
    if(req.session.email) {
        var insertQuerys = [];
        var deleteStatment = "delete from skill_data where email = '" + req.session.email + "';";
        dbManager.deleteStatment(deleteStatment);

        for(var i = 0; i < req.body.arr.length; i++) {
            var data = req.body.arr[i];
            if(data.skill.trim() != "" && data.subskill.trim() != "" 
                && data.name.trim() != "" && data.nivau.trim() != "") {
                var insertQuery = "INSERT into " + tabellen + " (email, skill, subskill, NAME, nivau) VALUES ('"
                    + req.session.email + "', '" 
                    + data.skill + "', '"
                    + data.subskill + "', '"
                    + data.name + "', '"
                    + data.nivau
                    + "');";
                insertQuerys[i] = insertQuery;
            }
        }
        dbManager.insertDataWithQuerys(insertQuerys);
    }
});

Anstelle der Alten skill_data Tabelle habe ich jetzt aber eine Tabelle die ich wie folgt zusammenjoinen kann:

var tabellen = "user join user_mitarbeiter on user.user_id = user_mitarbeiter.user_id"
                 + " join mitarbeiter on user_mitarbeiter.mitarbeiter_id = mitarbeiter.mitarbeiter_id"
                 + " join mitarbeiter_skill on user_mitarbeiter.mitarbeiter_id = mitarbeiter_skill.mitarbeiter_id";
    

Jetzt möchte ich den saveSkillData Code so umschreiben, dass er auch für die neuen Tabelle funktioniert, also für die gejointe Tabelle anstelle der alten Tabelle skill_data.

Habe ich mir meine Anwendung gerade komplett kaputt "Datenbanken normalisiert"? Ich krieg schon Kopfschmerzen, wenn ich nur darüber nachdenke, welche Values die gejointe Tabelle jetzt frisst. (da alle Tabellen zurzeit leer sind, zeigt mir sqlite auch keinen Header an, selbst bei .header on nicht :( )

akzeptierte Antworten

  1. maaaaaaan

    insert into user_mitarbeiter
    
    					join (select user_id from user where email = 'tester@gmx.de') into u_id on user_mitarbeiter.user_id = u_id.user_id
    					join mitarbeiter on user_mitarbeiter.mitarbeiter_id = mitarbeiter.mitarbeiter_id 
    					join mitarbeiter_skill on user_mitarbeiter.mitarbeiter_id = mitarbeiter_skill.mitarbeiter_id
    					
    					(
    					user_id,
    					name,
    					skill,
    					subskill,
    					nivau
    					)
    					values
    					(
    					u_id.user_id,
    					'Mustermann',
    					'Java',
    					'5'
    					);
    

    wieso geht das net?

    1. Hi,

      insert into user_mitarbeiter
      
      					join (select user_id from user where email = 'tester@gmx.de') into u_id on user_mitarbeiter.user_id = u_id.user_id
      					join mitarbeiter on user_mitarbeiter.mitarbeiter_id = mitarbeiter.mitarbeiter_id 
      					join mitarbeiter_skill on user_mitarbeiter.mitarbeiter_id = mitarbeiter_skill.mitarbeiter_id
      					
      					(
      					user_id,
      					name,
      					skill,
      					subskill,
      					nivau
      					)
      					values
      					(
      					u_id.user_id,
      					'Mustermann',
      					'Java',
      					'5'
      					);
      

      wieso geht das net?

      weil beim insert kein join erlaubt ist?

      Wie soll das auch funktionieren?

      Der noch nicht existente Datensatz, der eingefügt werden soll, kann ja noch gar nicht von den zu joinenden Tabellen referenziert werden, weil er dazu ja erst mal eingefügt werden müßte.

      cu,
      Andreas a/k/a MudGuard

      1. hm... scheiße

        dann muss ich für jede betroffene tabelle ein eigenes insert machen? ist doch zum kotzen...

        1. Tach!

          dann muss ich für jede betroffene tabelle ein eigenes insert machen? ist doch zum kotzen…

          Du wolltest dir Inserts sparen und dachtest, mit Phantasiesyntax sei das zu erreichen? Wenn man sich nicht selbst mit den Tiefen der SQL-Statement-Generierung und indivdueller Ausführung nebst Überwachung abgeben möchte, nimmt man ORMs, die einem diese Arbeit abnehmen.

          dedlfix.

          1. danke, von orms wusste ich bisher noch nichts.

            ich teste das jetzt mit dem hier:

            node-sqlite3-orm

        2. Wo ist dein Problem? Du hast alle Daten, generierst drei Inserts und pumpst die in einer Transaktion in die DB. Das läuft von der Schreibarbeit auf's Gleiche hinaus.