/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL: triggers syntax?
Fra : jonas@delfs.dk


Dato : 15-09-06 09:51

Hej gruppe

Jeg kæmper med at få skrevet en trigger til MySQL 5.1 der ved
indsættelse af en række med et bestemt products_id i en orders tabel
automatisk indsætter en membership expiration dato i en anden tabel i
en anden database.

Jeg har prøvet mig lidt frem da det ikke virkede efter hensigten, men
lige nu ser den sådan ud:

CREATE TRIGGER add_payment_expiration AFTER INSERT ON orders_products
FOR EACH ROW
   BEGIN
      IF NEW.products_id = 30 THEN
         INSERT INTO another_db.some_table
            (customer_id,payment_expiration)
            SELECT o.customers_id, DATE_ADD(o.date_purchased, INTERVAL 1 YEAR)
            FROM orders o, orders_products op
            WHERE op.orders_products_id=NEW.orders_products_id &&
o.orders_id=op.orders_id;
      END IF;
   END

I et forsøg på at skære problemet ind til benet, har jeg fundet frem
til følgende virker fint:

CREATE TRIGGER add_payment_expiration AFTER INSERT ON orders_products
FOR EACH ROW INSERT INTO users (customer_id,payment_expiration) VALUES
(1, '2006-02-02 11:11:11');

Mens disse to stadig giver syntax error ved 'INSERT INTO':

CREATE TRIGGER add_payment_expiration BEFORE INSERT ON orders_products
FOR EACH ROW
   BEGIN
      INSERT INTO users (customer_id,payment_expiration) VALUES (1,
'2006-02-02 11:11:11');
   END

CREATE TRIGGER add_payment_expiration BEFORE INSERT ON orders_products
FOR EACH ROW
   IF NEW.products_id = 30 THEN
      INSERT INTO users (customer_id,payment_expiration) VALUES (1,
'2006-02-02 11:11:11');
   END IF;

Hvad er det jeg har misforstået?

Mvh. Jonas


 
 
Peter Brodersen (15-09-2006)
Kommentar
Fra : Peter Brodersen


Dato : 15-09-06 13:54

On 15 Sep 2006 01:50:39 -0700, jonas@delfs.dk wrote:

>CREATE TRIGGER add_payment_expiration BEFORE INSERT ON orders_products
>FOR EACH ROW
>   BEGIN
>      INSERT INTO users (customer_id,payment_expiration) VALUES (1,
>'2006-02-02 11:11:11');
>   END

Sætter du dem fra kommandolinjen eller fra et andet sted? Det kan
tænkes, at din klient opdeler udsagnet efter semikolonnet.

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
nævner fx:

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|

Bemærk hvordan de sætter en alternativ delimiter før udsagnet. Om man
kan lave samme udsagn i fx phpmyadmin ved jeg ikke, men fra
kommandolinjen virker det fint.

--
- Peter Brodersen
Hvis ens primære argumentationsform er "Definér (udsagn)!", så
bør man overveje, om man reelt bidrager med noget til nettet

jonas@delfs.dk (15-09-2006)
Kommentar
Fra : jonas@delfs.dk


Dato : 15-09-06 15:01

Peter Brodersen skrev:
> On 15 Sep 2006 01:50:39 -0700, jonas@delfs.dk wrote:
>
> Det kan
> tænkes, at din klient opdeler udsagnet efter semikolonnet.

Hej Peter - tak for svar!

Har brugt en hel del tid på det nu, men så tror jeg også jeg har en
løsning.
For det første har jeg (stadig) ikke kunnet få det til at spille med
phpMyAdmin. Den kan ikke finde ud af det med både at sætte delimiter
og udføre resten af forespørgslen (ret mig hvis jeg tager fejl..).
Fra kommandolinjen har jeg langt om længe fået det til at virke.
Først sættes delimiteren (DELIMITER //) og derefter den egentlige SQL
som af en eller anden grund skal serveres på samme linje (i hvert fald
ikke bare pasted fra min editor med tabs og det hele - hvorfor egentlig
ikke?) - og så ser det egentligt ud til at virke.

mysql> DELIMITER //
mysql> CREATE TRIGGER add_payment_expiration AFTER INSERT ON
orders_products FOR EACH ROW BEGIN IF NEW.products_id = 30 THEN INSERT
INTO my_db.my_tbl (customer_id,payment_expiration) SELECT
o.customers_id, DATE_ADD(o.date_purchased, INTERVAL 1 YEAR) FROM orders
o, orders_products op WHERE
op.orders_products_id=NEW.orders_products_id &&
o.orders_id=op.orders_id;END IF;END//
Query OK, 0 rows affected (0.00 sec)

Mvh. Jonas


Søg
Reklame
Statistik
Spørgsmål : 177455
Tips : 31962
Nyheder : 719565
Indlæg : 6408148
Brugere : 218880

Månedens bedste
Årets bedste
Sidste års bedste