Avatar billede Probie Nybegynder
28. november 2011 - 21:23 Der er 13 kommentarer og
1 løsning

INSERT INTO flere tabler på en gang

hej alle sammen

jeg er igang med at oprette et forum, og når der oprettets en nyt indlæg eller en ny tråd skal der indsættes data i to tabeler, kan man gøre det i en sætning i stedet for to?

på forhånd tak :)
Avatar billede chris0905 Nybegynder
28. november 2011 - 21:37 #1
kan du sætte et "and" ind... nogen ala:

INSERT INTO table1 AND table2 ...

ved ikke om det virker, bare en tanke...
Avatar billede arne_v Ekspert
28. november 2011 - 22:01 #2
Lav det med 2 saetninger.

Hvis du vil lave det atomisk, saa put de to saetninger i en enkelt transaction (kraever InnoDB tabeller).
Avatar billede sneska Nybegynder
28. november 2011 - 22:15 #3
Du kan gøre det ved at lave en relation mellem de to tabeller hvor den ene har en 'foreign-key' fra den anden tb, en relations db. Det kræver self at de relatere til hinanden.
Se evt. http://www.eksperten.dk/spm/328625
Avatar billede Temp_dk Nybegynder
29. november 2011 - 06:16 #4
Her er en løsning der sikre dig hvis en af dine transaktioner går galt.

I filen "db_funktioner.php" skal du indsætte de rette værdier istedet for:
    <Bruger navn>
    <host hvor mysql er placeret>
    <password til databasen>

I filen "eksempel.php" er vist et eksempel på hvorledes man sikkert kan opdatere og indsætte i tabeller


filen db_funktioner
<?php
function ind_up($array_query)
{
    $dbuser = "<Bruger navn>";
    $url = "<host hvor mysql er placeret>";
    $pwd = "<password til databasen>";

    $con = mysqli_connect($url, $dbuser, $pwd );

    if(($array_query == NULL) ||($array_query == ""))
    return false;

    /* disable autocommit */
    mysqli_autocommit($con, FALSE);
    mysql_query("begin transaction");

    foreach($array_query as $key => $value)
    {
        if(is_array($value))
        {
            foreach($value as $k => $v)
            {
                $result = mysql_query($v);
                if ($result == false)
                $res = false;
            }
        }
        else
        {
            $result = mysql_query($value);
            if ($result == false)
            {
                $res = false;
            }
        }
    }
    if( $res )
    {
        mysql_query("commit;");
        return true;
    }
    else
    {
        mysql_query("rollback;");
        return false;
    }
}

?>


filen eksempel.php
<?php
include_once "db_funktioner.php";
/*
* Eksempelet herunder opdatere en tabel medens der indsættes i en anden.
*
* Fejler blot en query, vil der ikke ske ændringer i databasen,
*/

$sql_query_array = array();

array_push($sql_query_array,"UPDATE `config` SET `værdi` = '25'  WHERE `config`.`variabel` = 'max_paa_side'");

array_push($sql_query_array,"UPDATE `config` SET `værdi` = 'min@email' WHERE `config`.`variabel` = 'to'");

array_push($sql_query_array,"UPDATE `config` SET `værdi` = 'noreplay@email'  WHERE `config`.`variabel` = 'from'");

array_push($sql_query_array,"UPDATE `config` SET `værdi` = 'dummy test'  WHERE `config`.`variabel` = 'subject'");

array_push($sql_query_array,'INSERT INTO `data` (`nr` ,`fnavn` ,`mnavn` ,`enavn` ) VALUES '."('25', 'slut', '', test')");


$result = ind_up($sql_query_array);

if($result)
echo "Alt iorden";
else
echo "Der er ikke indsat / opdateret data";
?>
Avatar billede Probie Nybegynder
29. november 2011 - 20:49 #5
tænkte mere på en sql linje så som den OPFUNDENE neden under.

INSERT INTO
table1,
table2

(table1.overskrift,
table1.fk_table3_id,
table2.dag,
table2.body,
table2.fk_table1_id,
table2.fk_table4_id)

VALUES

('Test', '1', 'CURDATE()', 'det her er spørgsmålet til Test', 'tabel1.last_insert_id()', '2')

nogle der ved hvordan det skal gøres?
Avatar billede arne_v Ekspert
29. november 2011 - 20:53 #6
du skal bruge 2 x INSERT
Avatar billede Probie Nybegynder
30. november 2011 - 06:39 #7
Noget lignende det her arne?

INSERT INTO table1 (r1, r2) VALUES (v1, v2) INSERT INTO table2 etc.
Avatar billede sneska Nybegynder
30. november 2011 - 09:36 #8
Har du kigget på denne der http://dev.mysql.com/doc/refman/4.1/en/insert-select.html ..bare en tanke - måske INSERT ..SELECT kan gøre det eller at indsætte i 1 tb og bruge UPDATE  til de andre. Har ikke selv prøvet det men bare et forslag.
Avatar billede arne_v Ekspert
30. november 2011 - 15:07 #9
BEGIN
INSERT INTO table1 (r1, r2) VALUES (v1, v2)
INSERT INTO table2  ...
COMMIT
Avatar billede sneska Nybegynder
09. december 2011 - 10:10 #10
Her et eks. på hvordan det kan gøres med join:

INSERT INTO T5 (columns list)
SELECT columns list FROM t1 LEFT JOIN (t2, t3, t4)
ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c);

Man kan også bruge stored routine ;
http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html

Håber ellers du har fundet ud af det, er ikke sikker siden der ikke er accepteret svar :)
Avatar billede arne_v Ekspert
09. december 2011 - 17:53 #11
Den INSERT indsaette da kun i 1 tabel (den henter data fra 2 tabeller, men det er noget lidt andet).
Avatar billede arne_v Ekspert
17. december 2011 - 04:36 #12
probie??
Avatar billede Probie Nybegynder
19. december 2011 - 13:17 #13
mange tak for alle jeres svar, men jeg synes det var lidt uoverskuelig plus jeg havde en deadline jeg lige skule have overholdt så det blev bare til at jeg køre 2 mysql_query() men kan i ikke ligge et svar arne og sneska så må i dele point :)
Avatar billede arne_v Ekspert
19. december 2011 - 14:56 #14
ok
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