Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

AUTO_INCREMENT doppelt in einer Tabelle

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von heinzeric, 29 Dezember 2013.

  1. heinzeric

    heinzeric Benutzer

    Hi Leute,

    zwischen den Jahren hat man ja mal Zeit zum Nachdenken. Dabei quäle ich mich mit folgendem Problem:
    Ich habe die Tabellen von zwei Joomla-Modulen in einer Tabelle zusammengeführt, um die Datensätze für verschiedene Verwendungen nutzen zu können. Um neue Datensätze zu erzeugen, muss ich diese mit einem Modul anlegen (Namen und eMail). Dabei wird in der Spalte subid dieses Moduls eine fortlaufende ID-Ziffer erzeugt. Damit dieser Datensatz mit dem anderen Modul in Joomla bearbeitet werden kann, muss in die Spalte "id" dieses Moduls die gleiche ID-Ziffer stehen.
    Im ersten Modul wird die Ziffer automatisch erzeugt, da die Spalte das Extra AUTO_INCREMENT[​IMG] hat. Das ist aber offensichtlich keine Spalten-, sondern eine Tabelleneigenschaft. Zumindest kann diese AUTO_INCREMENT-Funktion in einer Tabelle nur einer Spalte zugeordnet werden. Ich finde im PHPMyAdmin jedenfalls keine Möglichkeit, der Spalte "id" diese Eigenschaft zuzuordnen.
    Gegenwärtig behelfe ich mich damit, dass ich mit PHPMyAdmin in der Spalte "id" die Ziffer manuell eintrage, was aber auf Dauer keine Lösung ist. Zumal die Datensätze von einer dritten Person erzeugt und weiter bearbeitet werden.
    Jetzt frage ich mich, wie ich diesen Vorgang automatisieren könnte? Wenn der Spalte "id" die Eigenschaft AUTO_INCREMENT tatsächlich nicht auch noch zugeordent werden kann, ließe sich das vielleicht über eine Select/Insert-Abfrage regeln. Hat da jemand eine Idee?
    Vielen Dank und guten Rutsch!
    heinzeric[​IMG]
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Aktuelle Versionen von Joomla laufen auch mit PostgreSQL. Damit ist das alles kein Thema. Du kannst pro Table zig Sequencen haben, Du kannst Sequencen auch Table-Übergreifend verwenden.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Ach ja: du könntest einen TRIGGER versuchen. Ungetestet. Aber wenn beide Spalten eh den selben Inhalt haben, dann ist das natürlich auch massiv sinnfrei.
     
  4. heinzeric

    heinzeric Benutzer

    Hi,
    danke für deine Antworten. Die erste bringt mich aber nicht wirklich weiter. Ich weiß ja nicht, auf welchem Level du dich bewegst. Ich brauche auf jeden Fall zum Betreiben von Joomla einen Provider, der mir den vorkonfigurierten Webspace zur Verfügung stellt. Und da läuft nun mal MySQL. Dafür nun den Provider zu wechseln, sehe ich auch nicht als Option.
    Allerdings war der Tipp mit dem Trigger wohl genau der richtige. Da sind wir allerdings wieder beim Level: ich habe dazu mal ein bisschen im Manual von MySQL gestöbert und muss feststellen: das ist mir zu hoch. Vielleicht hast du ja da mehr Ahnung.
    Also, wenn beim Anlegen eines neuen Datensatzes mit INSERT der neue DS in die Tabelle eingefügt wird, erzeugt AUTO INCREMENT in der Spalte "subid" der Tabelle "subsider" eine fortlaufende ID-Ziffer. Als AFTER Anweisung des Trigger müsste nun in die Spalte "id" der Tabelle die gleiche ID-Ziffer eingetragen werden. Allerdings würde die INSERT-Anweisung bei jedem Vervollständigen des Datensatzes auch wieder ausgeführt werden. Daher sollte der Trigger die Einschränkung haben, dass er nur ausgeführt werden muss, wenn id=0. Aber da sich das Ergebnis bei späterer Trigger-Ausführung ja nicht ändert, wäre das vielleicht auch nicht nötig.
    Ich wäre dir sehr dankbar, wenn du mir bei der Lösung des Problems helfen könntest, oder wenigstens einen Tipp gibst, der mir der bei der Lösung helfen könnte.
    Vielen Dank und guten Rutsch!
    heinzeric
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Würde Dir aber ganz andere Chance bieten ;-)

    Ein TRIGGER ist in den Beispiel noch immer massiv sinnfrei, ein VIEW täte es auch.

    Code:
    test=# create table foo (id serial, id2 int, val text);
    CREATE TABLE   
    Time: 160,694 ms   
    test=*# create or replace function trigger_foo() returns trigger as $$begin new.id2:=new.id; return new; end; $$language plpgsql;
    CREATE FUNCTION   
    Time: 86,491 ms   
    test=*# create trigger trg1 before insert on foo for each row execute procedure trigger_foo();
    CREATE TRIGGER   
    Time: 44,679 ms
    test=*# insert into foo (val) values ('max');
    INSERT 0 1
    Time: 10,592 ms
    test=*# insert into foo (val) values ('susi');
    INSERT 0 1
    Time: 0,195 ms
    test=*# insert into foo (val) values ('paula');
    INSERT 0 1
    Time: 0,225 ms
    test=*# select * from foo;
     id | id2 |  val
    ----+-----+-------
      1 |  1 | max
      2 |  2 | susi
      3 |  3 | paula
    (3 rows)
    
    Time: 0,278 ms
    test=*# alter table foo drop column id2;
    ALTER TABLE
    Time: 10,281 ms
    test=*# select id as id, id as id2, val from foo;
     id | id2 |  val
    ----+-----+-------
      1 |  1 | max
      2 |  2 | susi
      3 |  3 | paula
    (3 rows)
    
    Time: 0,273 ms
    test=*# create view sinnfreier_view as select id as id, id as id2, val from foo;
    CREATE VIEW
    Time: 13,143 ms
    test=*# select * from sinnfreier_view ;
     id | id2 |  val
    ----+-----+-------
      1 |  1 | max
      2 |  2 | susi
      3 |  3 | paula
    (3 rows)
    
    Time: 0,198 ms
    
    Syntax wird nicht unbedingt 1:1 in MySQL funktionieren.
     
  6. heinzeric

    heinzeric Benutzer

    Hi, du fleißiger Benutzer!

    Ich nehme an, der gepostete Code ist in PostgreSQL. Irgendwie habe ich da ein dejavue, aber egal. Dem Code kann ich aber auch entnehmen, warum das für dich sinnfrei erscheint. Wenn die erstellte Tabelle zunächst so aussehen würde:

    id | id2 | val
    ----+-----+-------
    0 | 1 | max
    0 | 2 | susi
    0 | 3 | paula

    und erst nach der ALTER Funktion so:

    id | id2 | val
    ----+-----+-------
    1 | 1 | max
    2 | 2 | susi
    3 | 3 | paula

    dann wüsstest du eventuell, worum es mir geht. Denk mal darüber nach. Aber jetzt erst mal guten Rutsch!
    Mein Einsatz ist in der Küche gefragt.
    Gruß heinzeric
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Sinnfrei für mich ist, in 2 oder mehr Spalten den selben Inhalt zu haben. Das ist so als wenn deine User-Tabelle 2 mal das Feld Vorname hätte und da in allen Datensätzen in beiden Spalten immer ein und dasselbe steht. Du kannst die Anzahl der Spalten von 2 auf beliebig viele erhöhen, es wird immer sinnfreier.

    Was gibt es denn leckeres?
     
  8. heinzeric

    heinzeric Benutzer

    Frohes neues Jahr,

    wir hatten Raclette, da muss man immer eine ganze Menge vorbereiten. War ganz lecker und lustig. Vorher gab's noch "Die Fledermaus" im Theater, daher musste ich gestern Nachmittag abrupt abbrechen.

    Zum Thema Sinnfreiheit (das Wort scheint es für die Rechtschreibüberprüfung nicht zu geben) noch einmal:
    Ich dachte, ich hatte das eingangs ausreichend beschrieben, aber scheinbar doch nicht.
    Ich administriere die Internetseiten eines Vereins mit Joomla 3.n. Für das Versenden von Newsletter nutze ich AcyMailing von Acyba. Die Daten der Newsletterempfänger werden in der Tabelle subscriber_irgendwas gespeichert. Allerdings nur Namen und eMail. Nun möchte ich meinem Vereinsvorstand die Möglichkeit bieten, die Mitgliederdaten (also noch mehr als Name und eMail) über Joomla zu verwalten und dann auch für bestimmte Zwecke (z. B. Erstellung von Anwesenheitslisten) nutzen zu können. Dafür nutze ich ContentBuilder von Crosstec. Um dafür nicht eine separate Tabelle ohne Verbindung zu Joomla zu nutzen, habe ich einfach die subscriber_ Tabelle um die für ContentBuilder erforderlichen und von mir gewünschten Spalten erweitert. Beide Module brauchen in der Datenbank natürlich eine id-Spalte. Das Problem ist, dass diese Spalte bei dem einen tatsächlich auch "id" heißt und beim anderen "subid". Ich habe bei beiden Anbietern nachgefragt, den Spaltennamen zu ändern ist praktisch unmöglich. Daher habe ich jetzt die beiden id-Spalten nebeneinander mit verschiedenen Bezeichnungen. Bei AcyMailing wird die Spalte beim Anlegen des Datensatzes automatisch gefüllt. Würde ich den Datensatz über ContentBuilder anlegen, würde das in der anderen Spalte ebenfalls automatisch geschehen. Aber ich kann den Datensatz halt nur einmal anlegen. Und ich möchte dafür AcyMailing nutzen, weil dadurch in anderen Spalten der Tabelle noch Eintragungen gemacht werden, die für das Versenden der Newsletter erforderlich sind, und das soll in jedem Fall erfolgen.
    Da die Spalte "id" nach dem Anlegen eines neuen Datensatzes durch unsere Schriftführerin auf 0 bleibt, in "subid" steht eine sich hochzählende Ziffer, kann der Datensatz mit einem ContentBuilder View zwar angezeigt, aber nicht bearbeitet werden. Daher muss ich gegenwärtig noch, nachdem die Schriftführerin neue Datensätze für neue Vereinsmitglieder mit AcyMailing erzeugt hat, mit PHPMyAdmin in der Tabelle die Spalte "id" um die in "subid" erzeugte Ziffer ergänzen. Danach ist eine Bearbeitung des Datensatzes mit dem ContentBuilder View möglich. Die Verfahrensweise ist etwas umständlich und erfordert immer meine Mitwirkung, denn in der Datenbank möchte ich die Schriftführerin auf keinen Fall rumfuhrwerken lassen.
    So, ich hoffe, das war jetzt verständlich genug. Allerdings ist mein Problem damit immer noch nicht gelöst.
    Aber trotzdem vielen Dank für deine Anteilnahme.
    Prosit Neujahr!
    heinzeric
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Ich hab im gezeigten Code auch einen TRIGGER erstellt. Aber das geht vermutlich in MySQL etwas anders, ich weiß es nicht.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden