Toon posts:

[SQL] triggers in een forum tabel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo tweakers,

Op dit moment heb de volgende tabel voor een klein forum wat ik gebruik:

post_id int(10) NOT NULL auto_increment PK,
topic_id int(10) NOT NULL default '0',
title varchar(250) NOT NULL default '',
message longtext NOT NULL,
poster_id int(10) NOT NULL default '0',
date_time datetime NOT NULL default '0000-00-00 00:00:00',
acl tinyint(1) NOT NULL default '0',
locked tinyint(1) NOT NULL default '0'

Topic_id bevat het ID van het topic waarbij de reactie hoort en als post_id gelijk is aan topic_id is het de firstpost van het topic.

Voor het toevoegen van een nieuw topic gebruik ik de volgende PHP code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$dp->setQuery( "INSERT INTO
                        #__forum ( post_id, title, message, poster_id, date_time, acl, locked )
                    VALUES
                        ( '', " . $dp->quotedMysqlSafe( $sTitle ) . ",
                      " . $dp->quotedMysqlSafe( $sMessage ) . ", 
                      " . $dp->mysqlSafe( getSuperGlobalValue( $_SESSION, 'iUserID' ) ) . ", 
                      NOW(), 
                      " . $dp->mysqlSafe( getSuperGlobalValue( $_SESSION, 'iUserAcl' ) ) . ", 
                      0 ) ");
    
    $dp->query();
    
    // Make topic_id equal to post_id
    $iTopicId = $dp->getInsertedId();
    
    $dp->setQuery( "UPDATE
                        #__forum
                    SET
                        topic_id = " . $iTopicId . "
                    WHERE
                        post_id = " . $iTopicId );
     $dp->query();


Ik heb dus 2 queries nodig om een nieuw topic aan te maken. De laatste query wil ik schrappen en vervangen door een trigger.

Ik had de volgende trigger in elkaar geknutseld:
SQL:
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER 
    trigger_name
BEFORE INSERT ON
    table_name
FOR EACH ROW
    BEGIN
           IF ( NEW.topic_id = 0 ) THEN
                   SET NEW.topic_id = NEW.post_id;
           END IF;
    END;


Maar dit werkte niet, topic_id bleef 0 :'(.
Na wat speurwerk in de MySQL handleiding kwam ik het volgende tegen:
In a BEFORE trigger, the NEW value for an AUTO_INCREMENT column is 0, not the automatically generated sequence number that will be generated when the new record actually is inserted.
Wat verklaart waarom het niet werkte.

Ik zal in de trigger op een of andere manier de auto_increment+1 waarde moeten berekenen om deze toe te kennen aan topic_id, maar hoe?

Dit is het deel waar jullie mij wellicht in de goeie richting kunnen duwen ;)

Alvast bedankt

Justin

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ik zou denken met een after trigger dan.

Who is John Galt?


Verwijderd

Maak je er toch een AFTER INSERT trigger van?
Zo doe je 't nu ook al in je PHP-code...

Verwijderd

Topicstarter
De AFTER INSERT heb ik ook geprobeerd, maar ook dat kreeg ik niet voor elkaar.

Ik krijg dan de melding 'Can't update table 'table_name' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.'

De trigger die ik probeerde:

SQL:
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER
     trigger_name
AFTER INSERT ON
     table_name
FOR EACH ROW
     BEGIN
             IF ( NEW.topic_id = 0 ) THEN
                    UPDATE table_name SET topic_id = LAST_INSERT_ID() WHERE post_id = LAST_INSERT_ID();
            END IF;
     END;



EDIT:
Hmzz, het ziet er naar uit dat je in een trigger niet kan refferen naar tabel waarop de trigger van toepassing is. Bron: http://bugs.mysql.com/bug.php?id=15686 en http://www.planetmysql.org/entries/1752

Iemand enig idee hoe dit dan op te lossen, of is de enige manier zoals ik het oorspronkelijk had (Dus via php in 2 queries)

[ Voor 33% gewijzigd door Verwijderd op 27-07-2006 20:12 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Waarschijnlijk kan het dan vanuit een after statement trigger wel.
Let dan wel op dat het niet werkt voor een statement waarin je meerdere rijen in een keer insert.

De nette manier zou dan het after row insert verzamelen van de primary key waarden (of een rowid oid.) zijn en dan deze per stuk behandelen in een after statement trigger.

Who is John Galt?