Avatar billede Slettet bruger
26. juni 2007 - 11:24 Der er 3 kommentarer og
1 løsning

SP Update problem

Jeg har lavet denne SP, men den virker ikke efter hensigten.
Den skal indsætte værdier, men kun hvis de er unikke (ikke er i tabellen allerede) - ellers skal værdierne opdateres.

Det er egentlig en simpel update, der giver problemet:
UPDATE
    `testplatformstatus`
SET
    `status` = status
WHERE
    `round` = round AND
    `id` = id;

Den opdaterer alle rækker i tabellen - ikke kun dem, der overholder WHERE kriteriet.

Hvis jeg hardcoder værdier for round og id ind, bliver kun de rækker opdateret.

Følgende sekvens beskriver min problemstilling:

CALL UpdateTpStatus('test1',1,1); --Virker (Der bliver oprettet en row)
CALL UpdateTpStatus('test2',1,2); --Virker (Der bliver oprettet en row)
CALL UpdateTpStatus('test3',1,3); --Virker (Der bliver oprettet en row)
CALL UpdateTpStatus('test4',1,3); --Virker ikke - alle rækkers status bliver sat til 'test4'



DROP PROCEDURE IF EXISTS `UpdateTpStatus`\\
CREATE PROCEDURE `UpdateTpStatus` (
    IN status VARCHAR(255),
    IN round INT,
    IN id INT
)
BEGIN
    IF EXISTS(
        SELECT
            *
        FROM
            `testplatformstatus`
        WHERE
            `testplatformstatus`.`round` = round AND
            `testplatformstatus`.`id` = id
    ) THEN
        UPDATE
            `testplatformstatus`
        SET
            `status` = status
        WHERE
            `round` = round AND
            `id` = id;
    ELSE
        INSERT INTO
            `testplatformstatus`
            (
                `status`,
                `round`,
                `id`
            )
        VALUES
            (
                status,
                round,
                id
            );
    END IF;
END\\
Avatar billede Slettet bruger
26. juni 2007 - 11:27 #1
Og lige for god ordens skyld felterne i min tabel.

TABLE testplatformstatus:
id - INT
round - INT
status - VARCHAR(255)
Avatar billede arne_v Ekspert
01. juli 2007 - 02:39 #2
Umiddelbart lyder det meget farligt at have SP argumenter og feltnavne som hedder
det samme.

Tror du ikke bare at

WHERE
            `round` = round AND
            `id` = id

altid er sand fordi den sammeligner de 2 med sig selv ??
Avatar billede Slettet bruger
01. juli 2007 - 14:47 #3
Du har ret. Det var det, der skulle til.
Tak for hjælpen - læg et svar.

DROP PROCEDURE IF EXISTS `UpdateTpStatus`\\
CREATE PROCEDURE `UpdateTpStatus` (
    IN param_status VARCHAR(255),
    IN param_round INT,
    IN param_id INT
)
BEGIN
    IF EXISTS(
        SELECT
            *
        FROM
            `testplatformstatus`
        WHERE
            `round` = param_round AND
            `id` = param_id
    ) THEN
        UPDATE
            `testplatformstatus`
        SET
            `status` = param_status
        WHERE
            `round` = param_round AND
            `id` = param_id;
    ELSE
        INSERT INTO
            `testplatformstatus`
            (
                `status`,
                `round`,
                `id`
            )
        VALUES
            (
                param_status,
                param_round,
                param_id
            );
    END IF;
END\\
Avatar billede arne_v Ekspert
01. juli 2007 - 16:01 #4
svar
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