Neue Spalte automatisch mit Werten füllen

norbert_pdm

Aktiver Benutzer
Beiträge
25
Hallo, hallo und guten Abend,

ich hab ein 'Faulheitsproblem'... ;-)
Ich habe eine Tabelle mit 4 Splaten: tbl_ID, tbl_stunden, tbl_starttag, tbl_endtag
Bisher ist es so, dass die 'Wochenstunden' bei der Abfrage automatisch per tbl_stunden / (tbl_endtag - tbl_starttag) / 7 bei der Abfrage errechnet werden.
Nun soll dieser Wert (da zukünftig änderbar) direkt in der Tabelle (tbl_wochenstunden) gespeichert werden. Bei neuen Datensätzen wird dieser Eintrag automatisch erstellt, was kein Problem ist.
Gibt es einen 'Trick', wie man bestehende Datensätze 'einfach' ergänzen kann?

Ich danke euch schon mal für Tipps.
VG, Norbert
 
Werbung:
Hier nochmal !. Du hast 2 gleiche Beiträge im Forum

das geht einfach mit UPDATE

UPDATE meineTabelle
set neuesFeld = tbl_stunden / (tbl_endtag - tbl_starttag) / 7 ;


Wobei noch zu klären wäre was tatsächlich in den Spalten steht bzw. von welchem Datentyp diese sind damit
die Berechnung auch funktioniert.

Weiterhin ist es auch möglich ein virtuelles Feld anzulegen in dem dann automatisch der Wert errechnet und eingetragen wird.
Sogar wenn man einzelne Werte ändert.

Poste mal das create deiner tabelle und ein paar Testdaten
 
Die Tabelle habe ich mit
Code:
CREATE TABLE tbl_kinder (
  tbl_kinder_ID INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
  tbl_kinder_kontingent TIME NULL  ,
  tbl_kinder_bewill_start DATE  NOT NULL  ,
  tbl_kinder_bewill_end DATE  NOT NULL  ,
PRIMARY KEY(tbl_kinder_ID))
ENGINE=InnoDB DEFAULT CHARSET=utf32 COLLATE=utf32_general_ci;
angelegt.

Das update der Tabelle erfolgte mit

Code:
ALTER TABLE `tbl_kinder` ADD `tbl_kinder_wochenstunden` DECIMAL(5,2) NULL AFTER `tbl_kinder_kontingent`;

Die Tabelle ist gefüllt mit (2x ;-)):
Code:
INSERT INTO `tbl_kinder` (`tbl_kinder_ID`, `tbl_kinder_kontingent`, `tbl_kinder_wochenstunden`, `tbl_kinder_bewill_start`, `tbl_kinder_bewill_end`) 
VALUES 
(NULL, '500:00:00', '', '2021-01-01', '2021-12-31'), (NULL, '350:00:00', '', '2021-07-01', '2021-12-31')

Bis jetzt frag ich die Wochenstunden so ab:

Code:
SELECT
    DATE_FORMAT(tbl_kinder_kontingent, '%H') / (
        TRUNCATE(
            DATEDIFF(tbl_kinder_bewill_end, tbl_kinder_bewill_start) / 7, 0
        )
    ) AS Wochenstunden
FROM
    tbl_kinder

Nun sollen eben genau diese Werte einmalig zurück in die Tabelle geschrieben werden. Gerundet auf 2 Stellen... ;-)
 
Dein 'Update' in #5 ist ein ALTER TABLE, Update wird so geschrieben: UPDATE. Du siehst den Unterschied?
Anwendung:

Code:
edb=# create table norbert_pdm(id int generated always as identity primary key, a int, b int, c int default null);
CREATE TABLE
edb=*# insert into norbert_pdm (a,b) select (random()*10)::int, (random()*10)::int from generate_series(1,5) s;
INSERT 0 5
edb=*# select * from norbert_pdm;
 id | a | b  | c
----+---+----+---
  1 | 9 | 10 | 
  2 | 7 |  0 | 
  3 | 1 |  8 | 
  4 | 9 |  7 | 
  5 | 4 |  8 | 
(5 rows)
edb=*# update norbert_pdm set c=a+b where c is null;
UPDATE 5
edb=*# select * from norbert_pdm;
 id | a | b  | c 
----+---+----+----
  1 | 9 | 10 | 19
  2 | 7 |  0 |  7
  3 | 1 |  8 |  9
  4 | 9 |  7 | 16
  5 | 4 |  8 | 12
(5 rows)

edb=*#

Was auch geht, zumindest bei mir:

Code:
edb=*# rollback;
ROLLBACK
edb=#
edb=#
edb=# create table norbert_pdm(id int generated always as identity primary key, a int, b int, c int generated always as (a+b) stored);
CREATE TABLE
edb=*# insert into norbert_pdm (a,b) select (random()*10)::int, (random()*10)::int from generate_series(1,5) s;
INSERT 0 5
edb=*# select * from norbert_pdm;
 id | a | b | c 
----+---+---+----
  1 | 6 | 7 | 13
  2 | 4 | 3 |  7
  3 | 4 | 7 | 11
  4 | 4 | 5 |  9
  5 | 4 | 7 | 11
(5 rows)

edb=*#

Das sieht nicht nur nach weniger Arbeit aus - das ist es auch.
 
Zuletzt bearbeitet:
Aber wie kann ich MySQL klar machen, dass es eine Schleife durchläuft?

vielleicht noch dazu: SQL kennt keine Schleifen. Manche Datenbanken haben interne Programmiersprachen (pl/pgsql, Perl, Phyton, PHP etc.) mit denen man Schleifen programmieren kann und diese laufen dann auch im 'Kern' der Datenbank, aber generell sollte man immer und überall bei Datenbanken Schleifen vermeiden.

SQL arbeitet mit Mengen. Ändere in dieser Menge von Daten die Spalte c auf die Summe der Spalten a und b.

Aber auch das will man eigentlich nicht, weil c direkt aus a und b berechenbar ist. Berechne das bei der Abfrage - das spart u.a. Speicherplatz für die Tabelle und beschleunigt somit die Abfrage.

select a,b, a+b as c from table;
 
Hallo akretschmer,

Ich hab deinen Vorschlag natürlich an meine Gegebenheiten angepasst und.. Es hat völlig problemlos geklappt.
Ich danke dir sehr!!!
Und auch noch mal zu der letzten Erläuterung!!

VG, Norbert
 
Werbung:
Zurück
Oben