mySQL: Lösen von 'Duplicate entry' in Webanwendung

Hallo,
ich habe eine Webanwendung (Servlets/Tomcat), die über JDBC auf
eine mySQL-DB zugreift.
In meiner Tabelle ‚Person‘ Habe ich einen inkrementellen PK_ID und
2 weitere Spalten (Vorname,Nachname).
Auf der Webanwendung versuche ich nun einen Insert mit folgender SQL-Anweisung zu generieren:
INSERT INTO PERSON VALUES (LAST_INSERT_ID() ,‚meinVN‘,‚meinNN‘);

klappt ja auch prima. Der Datensatz ist in der DB drin.
Problem ist, wenn ich versuche, den Datensatz mehrmals
hintereinander einzufügen („Duplicate entry“).
Weil er mehrmals versucht mit LAST_INSERT_ID()+1 den Datensatz einzufügen!

Wie kann ich dieses Problem am elegantesten lösen?
Danke
Fabian

Hallo,
ich habe eine Webanwendung (Servlets/Tomcat), die über JDBC
auf
eine mySQL-DB zugreift.
In meiner Tabelle ‚Person‘ Habe ich einen inkrementellen PK_ID
und
2 weitere Spalten (Vorname,Nachname).
Auf der Webanwendung versuche ich nun einen Insert mit
folgender SQL-Anweisung zu generieren:
INSERT INTO PERSON VALUES (LAST_INSERT_ID()
,‚meinVN‘,‚meinNN‘);

… so macht man das auch nicht.

INSERT INTO PERSON(Vorname, Nachname) VALUES (‚meinVN‘,‚meinNN‘)

reicht, dann macht er die auto_increment Spalte auch wirklich automatisch und eindeutig.

LAST_INSERT_ID liefert die ID des zuletzt eingefügten Namens, wenn du die brauchst, um Referenzen zu erstellen, kannst du die auch mit SELECT LAST_INSERT_ID() nach dem Insert abrufen, ggfs. gehts auch direkt mit jdbc ohne eigene Query.

Alexander

bekomme eine Fehlermeldung!
Hallo Alexander,
danke für den Tipp. Wenn ich dies auf SQL-Ebene direkt ausführe klappt das.
Aber wenn ich das über mein Java-Programm ausführe, bekomme ich folgende Fehlermeldung:

Syntax error or access violation, message from server: „You have an error in your SQL syntax near ‚INSERT INTO PERSON(V
NAME, NNAME) VALUES (‚meinVorname‘,‚meinNachname‘)‘ at line 1“
java.sql.SQLException: Syntax error or access violation, message from server: „You have an error in your SQL syntax nea
r ‚INSERT INTO PERSON(VNAME, NNAME) VALUES (‚meinVorname‘,‚meinNachname‘)‘ at line 1“
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1651)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:889)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:956)
at com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:928)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1871)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1805)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1231)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:172)
at src.DispatchPersonAction.save(DispatchPersonAction.java:117)
at java.lang.reflect.Method.invoke(Native Method)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:252)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:480)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1420)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:520)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2397)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
at java.lang.Thread.run(Thread.java:484)

Hallo Alexander,
danke für den Tipp. Wenn ich dies auf SQL-Ebene direkt
ausführe klappt das.
Aber wenn ich das über mein Java-Programm ausführe, bekomme
ich folgende Fehlermeldung:

Sehr merkwürdig, hat Java da irgend ein Problem mit dem Quoting (mit Java kenne ich mich nicht aus…).
Geht es evtl. mit INSERT INTO PERSON VALUES(NULL, ‚bla‘,‚blubb‘)
oder INSERT INTO PERSON(VNAME, NNAME) VALUES (‚meinVorname‘,‚meinNachname‘) ?

Alexander