Trigger (HeidiSQL) erstellen

black_aldi_79

Benutzer
Beiträge
5
hallo, ich bin ein absoluter anfänger in sachen msql bzw. heidiSQL und habe da mal eine frage zum trigger.
ich möchte gerne über einen trigger verhindern, dass datensätze mit dem gleichen wert (ein feld betroffen) gespeichert werden.

wie muss das trigger kommando aussehen?

select form table where wert = (kommt der wert schon vor) diesen datensatz nicht mehr speichern
 
Werbung:
Ich würde das Problem über einen Unique-Constraint lösen, nicht zwangshaft mittels einer Trigger-Funktion.

Nachdem ich keine Ahnung habe, wie deine Datenbank aussieht, baue ich schnell eine nach:

Code:
create table tabelle(id integer primary key, wert integer);

um die Spalte "wert" (in meinem Fall) eindeutig zu machen, verwendet man den Unique-Constraint, welchen man per folgendem Code nachträglich hinzufügen kann:

Code:
alter table tabelle add unique(wert);
 
kleiner Hinweis noch an den Fragesteller: es gibt kein msql, sondern mssql oder mysql, und HeidiSQL ist keine Datenbank, sondern ein Client für eine solche. Es ist immer hilfreich, Dinge korrekt zu benennen.
 
hallo kampfgummiberlie,

habe mir mal was zu unique einschränken durchgelesen 👍 und festgestellt, dass ich noch enen kleinen gedankenfehler drin habe.
aber trozdem vielen dank für eine hilfe.

hatte hier noch nicht zu ende gedacht 😬 bin halt anfänger

ich möchte messdaten (wert) die in einer bestimmten zeit 30 sec. doppelt angelegt wurden löschen.
messdaten (wert) die älter als 30 sec. sind sollten in der tabelle erhalten bleiben.
 
kleiner Hinweis noch an den Fragesteller: es gibt kein msql, sondern mssql oder mysql, und HeidiSQL ist keine Datenbank, sondern ein Client für eine solche. Es ist immer hilfreich, Dinge korrekt zu benennen.
hallo akretschmer,

dass stimmt näturlich 👍 es sollte mysql heißen und nicht msql.

das heidisql eine client oberfäche ist, dass ist mir auch bekannt 😉 wollte hier nur mitteilen, dass ich mit heidisql arbeite.
vielleicht gibt es was zu beachten, wenn ich über heidisql einen trigger erstelle?

gelobe besserung 😌 vielen dank 👍
 
Folgendes wird wohl NICHT in MySQL gehen...

Code:
postgres=# create table black_aldi_79(id int generated always as identity primary key, ts timestamp, ts_bin timestamp generated always as (date_bin('30seconds', ts, timestamp '2001-01-01')) stored unique, wert int);
CREATE TABLE
postgres=# insert into black_aldi_79 (ts, wert) values ('2022-05-3 09:00:00', 20);
INSERT 0 1
postgres=# insert into black_aldi_79 (ts, wert) values ('2022-05-3 09:10:00', 30);
INSERT 0 1
postgres=# insert into black_aldi_79 (ts, wert) values ('2022-05-3 09:10:01', 32);
ERROR:  duplicate key value violates unique constraint "black_aldi_79_ts_bin_key"
DETAIL:  Key (ts_bin)=(2022-05-03 09:10:00) already exists.
postgres=# select * from black_aldi_79;
 id |         ts          |       ts_bin        | wert 
----+---------------------+---------------------+------
  1 | 2022-05-03 09:00:00 | 2022-05-03 09:00:00 |   20
  2 | 2022-05-03 09:10:00 | 2022-05-03 09:10:00 |   30
(2 rows)

postgres=#

Zur Erklärung:

die Spalte ts_bin ist

  • automatisch berechnet, via der Funktion date_bin(), die es neu in PostgreSQL 14 gibt. Diese berechnet quasi ein Zeitfenster, in die ein Zeitwert reinpaßt. Hier berechnet aus den 3 Parametern Zeitinterval (30seconds), dem aktuellen Zeitwert (Spalte ts) sowoe einem Startzeitpunkt, ab dem diese Fenster berechnet werden (2001-01-01)
  • das Ergebnis dieser Berechnung wird automatisch da eingetragen (generated always ... stored)
  • und es wird ein UNIQUE drauf gesetzt

Du kannst daher nur immer nur 1 Messwert je eines solch definierten Zeitfensters eingeben.

Diese ganzen Features hat aber MySQL nicht (nein, auch nicht HeidiSQL ...), da muß man schon bessere Datenbanken nehmen ...
 
PS.: mit MySQL könnte man das Verhalten evtl. nachbauen:

  • via TRIGGER in einer extra Spalte die Funktion date_bin() nachbauen und bei jedem Insert füllen
  • auf diese Spalte ein UNIQUE CONSTRAINT setzen
 
PS.: mit MySQL könnte man das Verhalten evtl. nachbauen:

  • via TRIGGER in einer extra Spalte die Funktion date_bin() nachbauen und bei jedem Insert füllen
  • auf diese Spalte ein UNIQUE CONSTRAINT setzen
ich versuche mich mal dadurch zu wurschteln 😬

hatte es mir etwas einfacher vorgestellt 🙃

trigger -> BEFORE -> INSERT (vor dem einfügen) siehe Bild
 

Anhänge

  • mysql_bild_1.png
    mysql_bild_1.png
    20,1 KB · Aufrufe: 4
hallo ich nochmal :)

teste und spiele gerade noch etwas mit der sql abfrage herum.
?kann man nicht "zwei select abfragen" mit union vereinen?
 

Anhänge

  • mysql_2.png
    mysql_2.png
    49 KB · Aufrufe: 4
  • mysql_3.png
    mysql_3.png
    8,8 KB · Aufrufe: 4
Bitte keine Bilder. Jemand, der Dir vielleicht helfen will, muß nun das aus dem Bild abtippen. Text könnte er einfach kopieren.

Merke: wenn Du Hilfe willst, mache es den helfenden so einfach wie möglich.
 
Du fragst Spalten im Select Teil ab die gar nicht in der Tabelle in FROM vorkommen. Hast du vielleicht einen Join entfernt?

Auch verstehe ich nicht ganz was du vor hast. Die sinnvollste Lösung wäre ein UNIQUE-Constraint, siehe Post #2. Kann MySQL generell keine UNIQUE-Constraints (durchsetzten)? Teste das doch einfach mal oder recherchiere das.

Das mit Zeiträumen verstehe ich nicht ganz, was willst du jetzt genau, verhindern, das Werte in die Tabelle geschrieben werden können oder Werte nachträglich filtern? Warum entstehen denn Werte doppelt? Das mit diesen Pi mal Daumen 30 Sekunden hört sich doch recht abenteuerlich an.
 
Auch verstehe ich nicht ganz was du vor hast. Die sinnvollste Lösung wäre ein UNIQUE-Constraint, siehe Post #2. Kann MySQL generell keine UNIQUE-Constraints (durchsetzten)? Teste das doch einfach mal oder recherchiere das.

Das mit Zeiträumen verstehe ich nicht ganz, was willst du jetzt genau, verhindern, das Werte in die Tabelle geschrieben werden können oder Werte nachträglich filtern? Warum entstehen denn Werte doppelt? Das mit diesen Pi mal Daumen 30 Sekunden hört sich doch recht abenteuerlich an.
Unique kann MySQL wohl schon. Zeitfenster: es sollen wohl nicht innerhalb 30 sekunden Werte erfaßt werden (dürfen). Siehe meine Antwort.
 
Eventuell geht auch ein Check-Constraint, aber für mich hört sich das mit diesen 30 Sekunden nach einer "Bastel"-Variante an. Ich würde mehr an der Ursache forschen bevor ich die Datenbank Dateninput ablehnen lasse. Ich weiß ja gar nicht was dann passiert, dann gehen ja eventuell Daten verloren, etc.
 
Werbung:
Zurück
Oben