Avatar billede Mik2000 Professor
20. december 2019 - 20:23 Der er 6 kommentarer og
1 løsning

MySQL/MariaDB - trigger - opdater order (rækkefølge)

Hej
Jeg skal bruge noget hjælp til at lave en trigger i MySQL/MariaDB

Nedenstående er forenklet (fjernet felter der ikke er interessant for dette) og lavet til dansk for at gøre det en smule nemmere her

-------------------------------
UDFORDRING 1
-------------------------------
Jeg har en tabel
Sider

Med felter
id, navn, raekkefoelge

Nu vil jeg gerne med en trigger i MariaDB (udviklingsmiljø) og MySQL (server) sørge for at den tager højeste værdi i raekkefoelge og plusser med 1 når man indsætter

-------------------------------
UDFORDRING 2
-------------------------------
Jeg har en tabel
Sider

Med felter
id, kategori, navn, raekkefoelge

Nu vil jeg gerne med en trigger i MariaDB (udviklingsmiljø) og MySQL (server) sørge for at den tager højeste værdi i raekkefoelge som har samme kategori, og plusser med 1 når man indsætter
Avatar billede arne_v Ekspert
20. december 2019 - 22:10 #1
Vil helt normal auto increment ikke give den rigtige raekkefølge?

Indrømmet med huller, men en ORDER BY bør sortere korrekt.
Avatar billede Mik2000 Professor
20. december 2019 - 22:42 #2
I princippet jo - men det er fordi jeg har lavet så man kan rykke op og ned ved drag/drop (hvor den bruger numre til at opdaterer korrekt).

Så hvis man kunne lave trigger vil man slippe for i kode at skulle hente max og derefter tillægge en hver gang :)

Men har ikke rigtig prøvet triggers så meget og synes ikke lige jeg har kunne få det til at virke
Avatar billede arne_v Ekspert
21. december 2019 - 02:25 #3
Man kan vel godt lave en GUI ryk op og ned som kan håndtere ikke fortløbne numre.

Hvis man skal bytte om på række 3 og 4 så skal 4 have 3's værdi og 3 skal have 4's værdi.

Det er selvfølgelig nemmere hvis række nummer og værdi er ens, men det andet må kunne  lade sig gøre.
Avatar billede arne_v Ekspert
21. december 2019 - 02:26 #4
Hvis du vil lave det du beskriver, så ville jeg ikke bruge en trigger.

Jeg ville erstatte direkte INSERT med et kald af en stored procedure som finder den rigtige værdi og laver en INSERT.
Avatar billede arne_v Ekspert
21. december 2019 - 02:41 #5
Til inspiration:

mysql> CREATE TABLE spdemo (
    ->    id INTEGER NOT NULL,
    ->    s VARCHAR(50),
    ->    PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> INSERT INTO spdemo VALUES(1,'A');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> DELIMITER //
mysql> CREATE PROCEDURE xinsert(_s varchar(50))
    -> BEGIN
    ->    DECLARE _maxid INTEGER;
    ->    DECLARE _newid INTEGER;
    ->    SELECT MAX(id) INTO _maxid FROM spdemo;
    ->    SET _newid = _maxid + 3;
    ->    INSERT INTO spdemo VALUES(_newid,_s);
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql>
mysql> CALL xinsert('BB');
Query OK, 1 row affected (0.03 sec)

mysql> CALL xinsert('CCC');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> SELECT * FROM spdemo;
+----+------+
| id | s    |
+----+------+
|  1 | A    |
|  4 | BB  |
|  7 | CCC  |
+----+------+
3 rows in set (0.00 sec)
Avatar billede Mik2000 Professor
21. december 2019 - 19:51 #6
Wow har ikke prøvet stored procedures før - skal jeg nok lige læse lidt om så :)
Avatar billede arne_v Ekspert
21. december 2019 - 20:03 #7
Og der er en del at læse på.

Men mit eksempel bør være ret nem at forstå.
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

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