MySQL: woran erkenne ich die Einstellungen?
Chris
- datenbank
0 King^Lully0 Chris
0 Vinzenz Mai0 Chris
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
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?
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
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
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