Chris: MySQL: woran erkenne ich die Einstellungen?

Hallo Forum,

ich habe mal wieder eine Hausaufgabe, mit der ich nicht klarkomme.
Woran erkenne ich, was bei der MySQL Timestamp-Spalte eingestellt wurde und wie sie sich verhalten wird?

mysql> show columns from adresse;
+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id_adresse   | bigint(20)          | NO   | PRI | NULL    | auto_increment |
| update_time  | timestamp           | YES  |     | NULL    |                |
| insert_time  | timestamp           | YES  |     | NULL    |                |
| anrede       | char(10)            | YES  |     | NULL    |                |
| vorname      | varchar(35)         | YES  |     | NULL    |                |
| name         | varchar(35)         | YES  |     | NULL    |                |
| strasse      | varchar(35)         | YES  |     | NULL    |                |
| plz          | varchar(6)          | YES  |     | NULL    |                |
| ort          | varchar(35)         | YES  |     | NULL    |                |
| bemerkung    | text                | YES  |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

Was muss ich einstellen, damit update_time auf jeden Fall beim Update   geführt wird, und insert_time nur beim Anlegen eines neuen Datensatzes?

Ich habe schon CURRENT_TIMESTAMP, NOW(), NULL, gar nichts, mit und ohne "Nullwerte erlaubt" durch und kriege es einfach nicht hin.

Einmal hat es schon geklappt, aber das sah überhaupt nicht anders aus, als die Übersicht, die ich gepostet habe.
Leider weiß ich nicht mehr, was ich gemacht habe und warum nicht das angezeigt wird, was man vorgegeben hat.

Kann mir jemand qualifizierte Hilfe geben?

LG
Chris

  1. Was muss ich einstellen, damit update_time auf jeden Fall beim Update   geführt wird, und insert_time nur beim Anlegen eines neuen Datensatzes?

    Kann es sein, dass "on update"- oder "on insert"-Trigger hier zum Einsatz kommen sollten?

    1. Hallo Lully,

      Was muss ich einstellen, damit update_time auf jeden Fall beim Update   geführt wird, und insert_time nur beim Anlegen eines neuen Datensatzes?

      Kann es sein, dass "on update"- oder "on insert"-Trigger hier zum Einsatz kommen sollten?

      Da wäre zu einfach.
      Die Aufgbae lautet gezielt

      "mysql"  ...   "ohne Einsatz von Triggern"

      Unser Teacher scheint also der Meinung zu sein, es ginge auch ohne.

      LG
      Chris

  2. Hallo Chris,

    ich habe mal wieder eine Hausaufgabe, mit der ich nicht klarkomme.

    Woran erkenne ich, was bei der MySQL Timestamp-Spalte eingestellt wurde und wie sie sich verhalten wird?
    mysql> show columns from adresse;

    Du bist ganz dicht dran:

    Nutze [link:http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html@title=SHOW CREATE TABLE].

    Was muss ich einstellen, damit update_time auf jeden Fall beim Update   geführt wird, und insert_time nur beim Anlegen eines neuen Datensatzes?

    Lösung 1:
    Stelle die Spalte update_time auf automatisches Aktualisieren beim UPDATE.
    Verwende beim INSERT-Statement NOW(), um die Spalte insert_time mit Deinem
    gewünschten Wert zu versorgen.

    Lösung 2:
    Stelle die Spalte insert_time auf automatische Vorgabe beim INSERT.
    Verwende beim UPDATE-Statement NOW(), um die Spalte update_time mit dem
    aktuellen Timestamp zu versorgen.

    Lösung 3: (ja, ich weiß, nicht zugelassen - dämliche Vorgabe)
    Stelle die eine der beiden Spalten auf Automatik und versorge die andere
    mit einem Trigger mit dem gewünschten Wert.

    Lösung 4:
    Mache alles in der API.

    Lösung 5:
    Erstelle je eine Stored Procedure für Einfügen und Aktualisieren.
    Die SPs sorgen für die gewünschten Werte in den Timestamp-Spalten.

    Einmal hat es schon geklappt, aber das sah überhaupt nicht anders aus, als die Übersicht, die ich gepostet habe.

    Das MySQL-Handbuch sagt Dir im Abschnitt TIMESTAMP Properties as of MySQL 4.1:

    <zitat>
        It is not possible to have the current timestamp be the default value for
        one column and the auto-update value for another column.
    </zitat>

    Damit sollte klar sein, dass das von Dir gewünschte Verhalten nicht mit dem
    CRATE-TABLE-Statement zu erzielen ist.

    Lautet die Aufgabenstellung: Löse dies mit CREATE TABLE, so lautet die einzig
    korrekte Lösung:

    Dies ist nicht möglich.
    Falls diese Antwort nicht akzeptiert wird, würde ich an Deiner Stelle an geeigneter Stelle Widerspruch einlegen.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vincenz,

      Dies ist nicht möglich.
      Falls diese Antwort nicht akzeptiert wird, würde ich an Deiner Stelle an geeigneter Stelle Widerspruch einlegen.

      lieben Dank für Deine umfangreiche Antwort.
      Ich habe schon gedacht, ich wäre doof.
      Denn ich habe immer
      http://dev.mysql.com/doc/refman/5.0/en/timestamp-4-1.html
      vor Augen. Das sah auf den ersten Blick so aus, als wäre die Lösung safe, aber wenn ich genau hinsehe, dann wird da der created-Splate ein Wert übergeben. Auch wenn der NULL ist, ist die Schnittstelle damit natürlich _nicht_ safe. Das war aber die Aufgabe.

      Mit Triggern geht es allerdings fast bequem.
      Frage mich, wieso MySQL noch keine Möglichkeit für diese Standardaufgabe geschaffen hat, die ohne Trigger geht. Oder ist das Verhalten etwa noch "standard-konform"? Dann sollte der Musumsstandard vielleicht mal geändert werden.

      Ich bin jedenfalls gespannt, was morgen als Pointe herauskommt.

      Liebe Grüße
      Chris