Trigger: benötige Hilfe

RyoFF

Benutzer
Beiträge
5
Hallo, ich muss einen Trigger in MySQL erstellen.
Meine XAMPP Version ist 1.8.1.. PHPMyAdmin ist 3.5.2.2.

die relevanten Tabellen sind:

posts:
p_id
category_id
topic_id
post_creator
post_content
post_date

topics:
t_id
category_id
topic_title
topic_creator
topic_last_user
topic_date
topic_reply_date
topic_views


Nun möchte ich, dass wenn ich in der Datenbank einen neuen Post hinzufüge, dass im topics topic_reply_date automatisch gesetzt wird.

mein code ist:

Code:
BEGIN
UPDATE topics SET topic_reply_date=NOW(), topic_last_user=(SELECT 'post_creator' FROM 'posts' WHERE 'p_id' = '0')
WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 't_id' = '0') ;
 
END

ich erhalte aber die folgende Fehlermeldung:

Code:
#1064: You have an error in your SQL Syntax; check the manaual that corresponds to your MySQL server versionfor the right syntax to use near "(SELECT 'post_creator' FROM 'posts' WHERE 'id' = '0') WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 'id' = '0')" at line 2.

ich komme nicht darauf, was am code falsch sein kann und ob ic evtl. was kleiner oder sogar großes übersehe.

vielen dank schon mal im voraus.
RyoFF
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.420
Nun möchte ich, dass wenn ich in der Datenbank einen neuen Post hinzufüge, dass im topics topic_reply_date automatisch gesetzt wird.

mein code ist:

Code:
BEGIN
UPDATE topics SET topic_reply_date=NOW(), topic_last_user=(SELECT 'post_creator' FROM 'posts' WHERE 'p_id' = '0')
WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 't_id' = '0') ;
 
END

ich erhalte aber die folgende Fehlermeldung:

Code:
#1064: You have an error in your SQL Syntax; check the manaual that corresponds to your MySQL server versionfor the right syntax to use near "(SELECT 'post_creator' FROM 'posts' WHERE 'id' = '0') WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 'id' = '0')" at line 2.

ich komme nicht darauf, was am code falsch sein kann und ob ic evtl. was kleiner oder sogar großes übersehe.

vielen dank schon mal im voraus.
RyoFF

Aus dem Bauch heraus würde ich sagen, Du solltest im TRIGGER nicht nochmals ein SELECT auf die auslösende Tabelle machen, um aus dieser z.B. den post_creator zu frickeln. Zumindest in PostgreSQL hat man NEW, welches alle Felder des neuen Records enthält. Ich vermisse auch die Definition des TRIGGERs selbst.

Aber - ich kann mich irren. Mit MySQL spiele ich nicht.
 

RyoFF

Benutzer
Beiträge
5
Ich vermisse auch die Definition des TRIGGERs selbst.


Code:
-- Full Trigger DDL Statements
-- Note: Only CREATE TRIGGER statements are allowed
DELIMITER $$
 
USE `alf`$$
 
CREATE
DEFINER=`root`@`localhost`
TRIGGER `alf`.`update_last_reply_user`
AFTER INSERT ON `alf`.`posts`
FOR EACH ROW
BEGIN
UPDATE topics SET topic_reply_date=NOW(), topic_last_user=(SELECT 'post_creator' FROM 'posts' WHERE 'p_id' = '') 
                       WHERE id=(SELECT 'topic_id' FROM 'posts' WHERE 't_id' = '') ;

                    END
 

RyoFF

Benutzer
Beiträge
5
Während das eine Problem noch nicht gelöst wurde, habe ich ein Weiteres.
Und zwar möchte ich eine Funktion mit MySQL erstellen.
Und zwar habe ich in der Tabelle 'users' ein Feld 'aktiv'. Hier befindet sich entweder der Wert 'NULL' oder ein generierter md5-Code.

Nun möchte ich mit der Funktion alle Benutzer anzeigen lassen die nicht den Wert 'NULL' haben.

users:
u_id
username
password
email
vorname
nachname
aktiv

Ich hätte gedacht, dass sollte reichen, allerdings wird das nicht angenommen. Vielleicht hat hjemand parallel zum anderen Problem hier auch noch jemand eine Hilfe parat :)
Code:
BEGIN
  SELECT 'username' FROM users WHERE aktiv = '!NULL';
  END
 

akretschmer

Datenbank-Guru
Beiträge
9.420
Ich hätte gedacht, dass sollte reichen, allerdings wird das nicht angenommen. Vielleicht hat hjemand parallel zum anderen Problem hier auch noch jemand eine Hilfe parat :)
Code:
BEGIN
  SELECT 'username' FROM users WHERE aktiv = '!NULL';
  END

Vergleiche auf NULL nicht mit = sondern mit is null

Code:
test=*# create table ryoff (id int, value int);
CREATE TABLE
test=*# insert into ryoff values (1,0);
INSERT 0 1
test=*# insert into ryoff values (2,NULL);
INSERT 0 1
test=*# insert into ryoff values (3,1);
INSERT 0 1
test=*# select * from ryoff where value = NULL;
 id | value
----+-------
(0 rows)

test=*# select * from ryoff where value is NULL;
 id | value
----+-------
  2 |
(1 row)

test=*# select * from ryoff where value is not NULL;
 id | value
----+-------
  1 |     0
  3 |     1
(2 rows)

Grundlagen, btw ;-)
 

RyoFF

Benutzer
Beiträge
5
Hi,
vielen Dank dir schon mal für die Hilfe.
Also ich wollte gerne eine Routine erstellen/speichern. Eine Funktion, die ich immer wieder ausführen kann.
Wie bereits kurz erwähnt, möchte ich zählen, wieviele USER aktiv (also das Feld mit NULL gefüllt ist.)

Mein code dazu ist -->

Code:
DELIMITER $$
CREATE FUNCTION active_users()
RETURNS INT
 
DECLARE users_count INT;
BEGIN
SELECT COUNT(*) INTO users_count FROM users WHERE aktiv is NULL;
RETURN(users_count);
END
$$
DELIMITER ;

Hast jemand einen Tipp für mich, was an dem Code falsch sein kann? Workbench markiert DECLARE als falsch. Aber evtl ist das nicht der einzige Fehler. Und wenn doch, was kann ich statt DECLARE verwenden?

Viele Grüße
RyoFF
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.420
Hi,
vielen Dank dir schon mal für die Hilfe.
Also ich wollte gerne eine Routine erstellen/speichern. Eine Funktion, die ich immer wieder ausführen kann.
Wie bereits kurz erwähnt, möchte ich zählen, wieviele USER aktiv (also das Feld mit NULL gefüllt ist.)

Mein code dazu ist -->

Code:
DELIMITER $$
CREATE FUNCTION active_users()
RETURNS INT
 
DECLARE users_count INT;
BEGIN
SELECT COUNT(*) INTO users_count FROM users WHERE aktiv is NULL;
RETURN(users_count);
END
$$
DELIMITER ;

Hast jemand einen Tipp für mich, was an dem Code falsch sein kann? Workbench markiert DECLARE als falsch. Aber evtl ist das nicht der einzige Fehler. Und wenn doch, was kann ich statt DECLARE verwenden?

Viele Grüße
RyoFF


Google, 2 Sekunden, findet man Beispiele für Funktionen mit MySQL: http://sql-info.de/mysql/examples/create-function-examples.html . Da kommt das DECLARE erst nach dem BEGIN.
 
Oben