Avatar billede roo104 Nybegynder
14. september 2003 - 19:19 Der er 25 kommentarer og
1 løsning

Indsæt ved mange til mange relation

Mine tabeller ser sådan her ud:
    server
    ------
    id_server
    ip
   
    serv_user
    ---------
    id_server
    id_user

    user
    ----
    id_user
    nick
    password

Jeg skal indsætte i tabellen server, så der kommer en relation mellem server og user. id_server bliver auto genereret, ip kommer fra brugeren og jeg kender id_user.
Hvordan skal indsert syntaksen være ?
Avatar billede arne_v Ekspert
14. september 2003 - 19:25 #1
Du indsætter IP i server, databasen genererer et id_server, du fisker
det og indsætter det og id_user i serv_user. 2 ganske almindelige INSERT.
Hvordan du fisker det id afhænger lidt af sprog og database.
Avatar billede roo104 Nybegynder
14. september 2003 - 19:26 #2
det er mysql, men imellem de 2 insert sætninger kunne der komme indput fra en anden bruger
Avatar billede arne_v Ekspert
14. september 2003 - 19:27 #3
MySQL har f.eks. LAST_INSERT_ID() funktionen.
Avatar billede roo104 Nybegynder
14. september 2003 - 19:28 #4
havde tænkt på bare at sige:
insert into serv_user values(select max(id_server) from server,id_user);
Avatar billede arne_v Ekspert
14. september 2003 - 19:28 #5
JDBC 3.0 (Java 1.4+) har en metode getGeneratedKeys på Statement.
Avatar billede arne_v Ekspert
14. september 2003 - 19:29 #6
Både LAST_INSERT_ID og genGeneratedKeys er per Connection og kan
derfor håndtere flere sdamtidige brugere.
Avatar billede arne_v Ekspert
14. september 2003 - 19:29 #7
SELECT MAX kan derimod *ikke* håndtere flere samtidige brugere.
Avatar billede arne_v Ekspert
14. september 2003 - 19:29 #8
Og lad os kalde det for et svar.
Avatar billede roo104 Nybegynder
14. september 2003 - 19:31 #9
cool nok prøver lige
Avatar billede roo104 Nybegynder
14. september 2003 - 19:43 #10
Det her virker ikke lige:
    String query = "insert into server (ip) values ('"+ip+"');";

    Statement stmt = conn.createStatement();
    stmt.executeUpdate(query);
   
    String queryID = "insert into user_server values (LAST_INSERT_ID(),'"+userID+"');";
    stmt.executeUpdate(queryID);

Og den her virker heller ikke lige, bruger dog bare MySQL's ODBC driver:
    String query = "insert into server (ip) values ('"+ip+"');";

    Statement stmt = conn.createStatement();
    stmt.executeUpdate(query);
    ResultSet RS = stmt.getGeneratedKeys();

    while (RS.next()) {
        String queryID = "insert into user_server values ('"+RS.next()+"','"+userID+"');";
        stmt.executeUpdate(queryID);
    }
Avatar billede roo104 Nybegynder
14. september 2003 - 19:45 #11
kan heller ikke lige finde info om LAST_INSERT_ID() i mysql doc
Avatar billede arne_v Ekspert
14. september 2003 - 19:48 #12
LAST_INSERT_ID er et stykke nede på denne side:

http://www.mysql.com/doc/en/Miscellaneous_functions.html
Avatar billede arne_v Ekspert
14. september 2003 - 19:49 #13
String queryID = "insert into user_server values ('"+RS.next()+"','"+userID+"');";

skal vel være

String queryID = "insert into user_server values ("+RS.getInt(1)+",'"+userID+"');";
Avatar billede roo104 Nybegynder
14. september 2003 - 19:50 #14
fandt den :)
String queryID = "insert into user_server values (select LAST_INSERT_ID(),'"+userID+"');";

virker dog heller ikke
Avatar billede arne_v Ekspert
14. september 2003 - 19:50 #15
Der er iøvrigt en meget illustrativ side her:

http://www.mysql.com/articles/autoincrement-with-connectorj.html
Avatar billede arne_v Ekspert
14. september 2003 - 19:51 #16
Du kan nok ikke skrive sådan en SELECT midt i en INSERT.
Avatar billede roo104 Nybegynder
14. september 2003 - 19:55 #17
Med java måden får jeg en NullPointerException, virker det også med ODBC adgang ?
Avatar billede arne_v Ekspert
14. september 2003 - 20:00 #18
Prøv lige med:

stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
Avatar billede arne_v Ekspert
14. september 2003 - 20:01 #19
Nej jeg tror ikke på at JDBC ODBC bridgen understøtter den slags.

MySQL JDBC driver gør. Jævnfør f.eks. eksemplet i mit 19:50:13 link !
Avatar billede roo104 Nybegynder
14. september 2003 - 20:01 #20
hehe den havde jeg lige prøvet. ligger lige Connector/J 3.0 ind
Avatar billede arne_v Ekspert
14. september 2003 - 20:10 #21
Du skal på version 3.x for at getGeneratedKeys virker.

SELECT LAST_INSERT_ID() har virket i hundrede år.
Avatar billede roo104 Nybegynder
14. september 2003 - 20:15 #22
har lagt connector i j2sdk1.4.2\jre\lib\ext
og prøver med, men det virker ikke

    String driver = "com.mysql.jdbc.Driver";
    Class.forName(driver).newInstance();
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/csadmin?user=xxx&password=xxx");

Den siger org.apache.jasper.JasperException: com.mysql.jdbc.Driver
Avatar billede arne_v Ekspert
14. september 2003 - 20:18 #23
Prøv lige og smid den i webapps\xxxx\WEB-INF\lib ?

PS: Du har pakket jar filen ud af zip filen ikke ?
Avatar billede roo104 Nybegynder
14. september 2003 - 20:18 #24
Ok en gang tomcat reboot hjalp lidt
nu er fejlen org.apache.jasper.JasperException: General error,  message from server: "Column count doesn't match value count at row 1"
Avatar billede roo104 Nybegynder
14. september 2003 - 20:19 #25
findes der noget javadoc over connector ?
Avatar billede roo104 Nybegynder
14. september 2003 - 20:33 #26
så nu virker det tak endnu en gang arne

Det skulle være sådan her:
    Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                                          java.sql.ResultSet.CONCUR_UPDATABLE);

    stmt.executeUpdate(query,Statement.RETURN_GENERATED_KEYS);
    ResultSet RS = stmt.getGeneratedKeys();
   
    if (RS.next()) {
        String queryID = "insert into user_server (id_server,id_user) values ("+RS.getInt(1)+","+userID+");";
        stmt.executeUpdate(queryID);
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester