Tom: MySQL 3.23 versa 4.0

Hello,

ich habe hier ein Statement, dass bei MySQL 4.0.18 läuft.
Nun bin ich mir nicht mehr sicher, ob es bei MySQL 3.23.55 auch schon ging.

Es handelt sich um die "insert .. select" - Syntax

Steht das Manual von der 3er-Version auch noch irgendwo im Netz?

insert into products (wgr, sort)
select $wgr, max(b.sort)+1
from products b
where b.wgr = 5
group by b.wgr;

Die Tabelle hält Produkte. Um sie später in einer dem User genehmen Reihenfolge ausgeben zu können, gibt es sie Spalte sort. Darüber haben wir letzte Woche schon fabuliert. Es ist durch den Kunden so vorgegeben, dass neue Produkte bezüglich der Sortierung erstmal immer hinten an die jeweilige Warengruppe (wgr) angehängt werden.

Man kann sie dann später innerhalb der Gruppe hin und her togglen. Das funktioniert auch schon.

Das Statement da oben funktioniert auch. Ich spare mir dadurch ein zweites Statement für max(sort) aus wgr. Dadurch kann ich mir auch das Sperren der Tabelle zur Bindung der beiden Statements sparen.

Mich interessiert nun, ob das auch schon so bei MySQL 3.23.55 funktioniert hat, da ich die Applikation auch noch herunter-portieren muss.

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. hi,

    ich habe hier ein Statement, dass bei MySQL 4.0.18 läuft.
    Nun bin ich mir nicht mehr sicher, ob es bei MySQL 3.23.55 auch schon ging.

    Es handelt sich um die "insert .. select" - Syntax

    die gab's m.W. auch schon in der 3er-version von mysql.

    Steht das Manual von der 3er-Version auch noch irgendwo im Netz?

    bei befehlen die ein "neueres" mysql erfordern, weist das manual da meistens drauf hin.

    insert into products (wgr, sort)
    select $wgr, max(b.sort)+1
    from products b

    das könnte allerdings problematisch werden, weil du in die selbe tabelle einfügst, aus der du auch auslesen willst.

    "Die Ziel-Tabelle des INSERT-Statements darf nicht in der FROM-Klausel des SELECT-Teils der Anfrage erscheinen, weil es in ANSI-SQL verboten ist, aus derselben Tabelle auszuwählen (SELECT), in die eingefügt wird."
    http://dev.mysql.com/doc/mysql/de/INSERT_SELECT.html

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
    1. Hello,

      die gab's m.W. auch schon in der 3er-version von mysql.

      insert into products (wgr, sort)
      select $wgr, max(b.sort)+1
      from products b

      das könnte allerdings problematisch werden, weil du in die selbe tabelle einfügst, aus der du auch auslesen willst.

      "Die Ziel-Tabelle des INSERT-Statements darf nicht in der FROM-Klausel des SELECT-Teils der Anfrage erscheinen, weil es in ANSI-SQL verboten ist, aus derselben Tabelle auszuwählen (SELECT), in die eingefügt wird."
      http://dev.mysql.com/doc/mysql/de/INSERT_SELECT.html

      Danke für den Hinweis.
      Allerdings lese ich nur einen einzigen aggregierten Wert aus der Quelltabelle. Der wird dann anschließend aber auch verändert. Danach ist das Statement abgegessen.

      Meinst Du, ich sollte da doch besser zwei (werden dann ja wieder vier mit LOCK und UNLOCK) Statements daraus machen? Solche Selbstbezüge habe ich früher bei dBase schon immer gebaut. Dieser wäre erlaubt gewesen, da eindeutig erst gelesen und dann geschrieben wird.

      Funktioniert hat es bisher immer, aber das ist für mich ja kein Kriterium.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau