php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 15.02.2010, 19:13  
Neuer Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 24
PHP-Kenntnisse:
Fortgeschritten
daniels. befindet sich auf einem aufstrebenden Ast
Standard LAST_INSERT_ID innerhalb eines mulit-row Inserts

Hallo ich würde gerne innerhalb eines multi-row Inserts auf den zuvor hinzugefügten AI Wert zugreifen.

Leider funktioniert das nicht. Kennt ihr eine andere Möglichkeit das umzusetzen?

Rauskommen soll:
PHP-Code:
animal_id language_id animal_name
1     1     hund
1     2     dog 

Code:
CREATE  TABLE animal (
 animal_id  INT NOT NULL AUTO_INCREMENT ,
 language_id INT NOT NULL ,
 animal_name VARCHAR(255) NOT NULL ,
 PRIMARY KEY (animal_id, language_id) 
);


INSERT INTO animal
(animal_id ,language_id ,animal_name)
VALUES 
(NULL ,1, 'hund'),
(LAST_INSERT_ID(), 2, 'dog')
daniels. ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.02.2010, 21:07  
thomas_w
Gast
 
Beiträge: n/a
Standard

Beim Multiurow-Insert liefert MySQL (5.1.3) LAST_INSERT_ID() immer den ersten generierten Wert. Also auch bei der zweiten bzw. dritten eingefügten Zeile liefert LAST_INSERT_ID() die ID des ersten eingefügten Datensatzes.

Ich habe Deine Tabelle um die Spalte "prev_id" ergänzt.

Folglich müßte

Code:
INSERT INTO animal
(animal_id ,prev_id, language_id ,animal_name)
VALUES 
(LAST_INSERT_ID(),   LAST_INSERT_ID()-1, 1, 'hund'),
(LAST_INSERT_ID()+1, LAST_INSERT_ID(),    2, 'dog'),
(LAST_INSERT_ID()+2, LAST_INSERT_ID()+1, 1, 'huhn')
das gewünschte Ergebnis erzeugen (sofern der erste Insert bei LAST_INSERT_ID() eine 1 liefert).

1, 0, 1, 'hund'
2, 1, 2, 'dog'
3, 2, 1, 'huhn'

Im 2. Datensatz steht die PREV_ID vom 1. Datensatz.

Sieht zwar etwas krude aus und ist eine MySQL Spezialität, aber ist eventuell die Lösung zu deinem Problem.

Grüße
Thomas
  Mit Zitat antworten
Alt 16.02.2010, 00:03  
Neuer Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 24
PHP-Kenntnisse:
Fortgeschritten
daniels. befindet sich auf einem aufstrebenden Ast
Standard

Wie in deiner oberen bewchreibung funktioniert es bei mir leider nicht. Oder habe ich die Beschreibung falsch verstanden?
Ich will erreichen,dass die animal_id bei unterschiedlichen sprachen gleich bleibt. Last_insert_id liefert aber nicht die letzte id, zählt normal hoch.
daniels. ist offline   Mit Zitat antworten
Alt 16.02.2010, 08:07  
thomas_w
Gast
 
Beiträge: n/a
Standard

Na so wie es aussieht, gibt es da diverse Missverständnisse.
Ich denke, mein Beispiel läuft schon, aber nicht so wie Du es erwartest. Vermutlich möchtest Du folgendes..

Code:
INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(LAST_INSERT_ID(),  1, 'hund'),
(LAST_INSERT_ID(),  2, 'dog');
Das Ergebnis dieses Multi-Row-Insert sollte so dann aussehen.
1, 1, 'hund'
1, 2, 'dog'

LAST_INSERT_ID() liefert bei einem Multi-Row-Insert immer die erste vergebene ID.

Läuft dass bei Dir auch so? Beantwortet dass die Frage?

Bisher bin ich davon ausgegangen, dass "animal_id" der Primary Key der Tabelle animal ist, nach Deiner jetzigen Aussage stimmt dass nicht, sondern die Spalten "animal_id" und "language_id" zusammen ergeben einen eindeutigen zusammengesetzten Primary Key.

Grüße
Thomas
  Mit Zitat antworten
Alt 16.02.2010, 09:08  
Neuer Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 24
PHP-Kenntnisse:
Fortgeschritten
daniels. befindet sich auf einem aufstrebenden Ast
Standard

Hallo ich dachte, den zusammengesetzten PrimaryKey erkennt man am Create Statement. Wenn Last_insert_id doch die zuletzt eingefügte id zurückgibt, müsste der insert doch scheitern, da der primary Key bereits existiert?
daniels. ist offline   Mit Zitat antworten
Alt 16.02.2010, 09:31  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von daniels. Beitrag anzeigen
Code:
CREATE  TABLE animal (
 animal_id  INT NOT NULL AUTO_INCREMENT ,
 language_id INT NOT NULL ,
 animal_name VARCHAR(255) NOT NULL ,
 PRIMARY KEY (animal_id, language_id) );

Stimmt, den Primary Key (PK) erkennt man normalerweise am CREATE TABLE, dass der schon in Deiner ersten Mail stand, habe ich vollkommen übersehen, aber trotzdem richtig erraten

Die LAST_INSERT_ID() basiert aber auf der "animal_id", also nur auf einem Teil des PK. Zusammen mit der "language_id" ergibt sich der eindeutige PK. Beim Deinem Multi-Row-Insert musst Du somit selbst mit der "language_id" sicherstellen, dass der PK eindeutig bleibt.

Grüße
Thomas
  Mit Zitat antworten
Alt 16.02.2010, 10:23  
Neuer Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 24
PHP-Kenntnisse:
Fortgeschritten
daniels. befindet sich auf einem aufstrebenden Ast
Standard

Ich glaube wir reden immernoch aneinander vorbei ^^
Mir ist schon klar wie ich eine zusammengesetzen Pk behandeln muß. Bin auch nicht ganz neu im DB Umfeld.
Mir will diese LAST_INSERT_ID() Funktion aber nicht in den Kopf.
.
.
.
So, ich habe jetzt nochmal etwas herumporbiert und ich denke ich habe meinen Verständnissproblem gelöst.

Last_Insert_id() muß im gleichen Sql verwendet werden.
Innerhalb eine multi_row insert funktioniert dies nicht. Wenn man den SQL so aufbaut, dass zunächst ein einzelner Insert erzeugt wird , dann kann man in den folgenden Inserts LASt_INSERt_ID() nutzen.

Code:
INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(null,  1, 'hund');

INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(LAST_INSERT_ID(),  2, 'dog'),
(LAST_INSERT_ID(),  3, 'canis');
Mein Problem ist jetzt nur, dass ich das mit mysql und nicht mit mysqli umsetzen muß.

Geändert von daniels. (16.02.2010 um 10:37 Uhr).
daniels. ist offline   Mit Zitat antworten
Alt 16.02.2010, 10:57  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von daniels. Beitrag anzeigen
Code:
INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(null,  1, 'hund');

INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(LAST_INSERT_ID(),  2, 'dog'),
(LAST_INSERT_ID(),  3, 'canis');
Mein Problem ist jetzt nur, dass ich das mit mysql und nicht mit mysqli umsetzen muß.
Ich habe hier keine MySQL zum Ausprobieren, aber wie sieht denn jetzt das Ergebnis in der Tabelle nach den beiden INSERT aus?

Ich rate mal...

1, 1, 'hund'
2, 2, 'dog'
2, 3, 'canis'

Habe ich recht? Ich weis zwar nicht, was 'canis' bedeutet, aber wenn es in der Sprache 3 'hund' bedeutet, dann sind die drei "Hunde-"Datensätze nicht unter der identischen animal_id gespeichert und dass wolltest Du doch?

Ist den bezüglich dem LAST_INSERT_ID() ein Unterschied zwischen mysql und mysqli ?

Grüße
Thomas
  Mit Zitat antworten
Alt 16.02.2010, 11:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Code:
INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(null,  1, 'hund');

INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(LAST_INSERT_ID(),  2, 'dog'),
(LAST_INSERT_ID(),  3, 'canis');
Wenn das denn geht, sollte
Code:
INSERT INTO animal
(animal_id, language_id ,animal_name)
VALUES 
(null,  1, 'hund'),
(LAST_INSERT_ID(),  2, 'dog'),
(LAST_INSERT_ID(),  3, 'canis');
doch wohl auch gehen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 16.02.2010, 11:04  
Neuer Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 24
PHP-Kenntnisse:
Fortgeschritten
daniels. befindet sich auf einem aufstrebenden Ast
Standard

@thomas

Nein, das Ergebnis sieht wie gewollt aus:

1, 1, 'hund'
1, 2, 'dog'
1, 3, 'canis'


Mysqli erlaub multiquerys, was das oben genannte Sql ist.



p.s. canis ist latein für Hund.

Geändert von daniels. (16.02.2010 um 11:07 Uhr).
daniels. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
wie location.href innerhalb eines div containers laden hansschmidt JavaScript, Ajax und mehr 3 28.07.2009 06:01
[Erledigt] Code innerhalb eines Skriptes übergeben echo PHP Tipps 2008 11 30.11.2008 14:12
[Erledigt] Gültigkeit von Variablen innerhalb von Funktionen dable PHP Tipps 2008 13 13.08.2008 16:47
multiple sql verbindungen innerhalb einer datei Makuro PHP-Fortgeschrittene 8 20.02.2008 16:38
[Erledigt] Zugriff auf eine Klasse innerhalb einer Funktion -> Fehle PHP-Fortgeschrittene 23 05.02.2006 13:02
innerhalb heredoc wert einer Variablen zuweiden rudolfs PHP Tipps 2006 5 17.01.2006 20:07
Excel Sheet innerhalb einer HTML Seite anzeigen PHP Tipps 2005-2 4 20.09.2005 13:32
Mehrsprachigkeit innerhalb einer Datenbank Datenbanken 4 14.09.2005 17:01
form-tags nur innerhalb einer zelle,sonst nicht w3c-konform? Unbekanntes_Pferd HTML, Usability und Barrierefreiheit 4 30.08.2005 20:52
Problem mit Zahlen innerhalb von strpos() PHP Tipps 2005-2 6 25.07.2005 06:40
Mausposition innerhalb eines Elementes Buhmann HTML, Usability und Barrierefreiheit 1 20.01.2005 16:58
[Erledigt] Object innerhalb einer XML Parser Funktion deklarieren PHP-Fortgeschrittene 0 10.12.2004 14:40
[Erledigt] Query, der Daten innerhalb DB zwischen Tabellen verschiebt Datenbanken 6 18.09.2004 14:38
Referenzen (lies Pointer) innerhalb mehrdimensionaler Arrays PHP-Fortgeschrittene 2 17.09.2004 14:00
Daten innerhalb einer Tab. mit insert duplizieren/kopieren Datenbanken 4 15.09.2004 15:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
last_insert_id() beispiel, last_insert_id beispiel, last_insert_id(), php last_insert_id() beispiel, msqli last_insert_id, last_insert_id beispiele, mysql insert and last_insert_id(), last_insert_id() beispiele, last_insert_id insert multi row, beispiel last_insert_id, last_insert_id, mysqli multiple insert last_id, insert into where last_insert_id(), last_insert_id() zählt nicht hoch, insert into multi last_insert_id, last_insert_id() nicht eindeutig, mysql multi insert, last_insert_id() gibt immer 0 aus, last_insert_id() liefert immer 0, mysql last_insert_id

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum