Dynamically generate field value - mysql

Is there any way, in MySQL, to dynamically generate a field value? For example a field that stamps the exact date and time that a row was inserted.
You could just get the interface to do it (i.e. PHP) but in a case where you have more than one handler it would be safer if I could get MySQL to do it independently.

The MySQL TIMESTAMP data type has a special default called CURRENT_TIMESTAMP that does this.
Read all about it:
http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
EDIT:
For the more generic case, use a trigger. You can set the value on an insert using a BEFORE INSERT triggers, and likewise you can set the value on updates using a separate BEFORE UPDATE trigger:
http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

Related

Create mySQL BEFORE/AFTER UPDATE trigger

Trying to understand how to make a trigger in mysql to automatically set a value in a record field. Not even sure if I need a BEFORE or AFTER trigger.
I have a table with one field named date_created and another date_updated, both of type datetime. The date_created field is set to NOT NULL and default to CURRENT_TIMESTAMP. The date_updated field is currently set to NULL, but I can change that if needed.
Whenever a new record is created, the date_created field gets filled automatically. This way I can omit the field from an input FORM.
Now whenever the record gets updated, I'd like for the date_updated field to be filled-in automatically - for any subsequent updates.
I've tried several versions but keep getting errors.
You don't need a trigger for this case. Use DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.
Read this manual page for details: https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html

MySQL MD5(CURRENT_TIMESTAMP) On Update

I'm creating a user registration form and when I get to confirming the user's email by emailing them, I need some sort of unique string to confirm against.
Instead of generating one in PHP and inserting it into the database, I wanted to try and add a column to my table that would hold a unique value that I could use whenever I needed to confirm something.
What I want to do is set the value to an MD5 of the current timestamp. I tried just doing SELECT MD5(CURRENT_TIMESTAMP) in phpMyAdmin just to see if it would let me and it did so I thought I'd add that to an update condition but it doesn't seem to be letting me.
ALTER TABLE users ADD confirmation VARCHAR(40) DEFAULT NULL ON UPDATE MD5(CURRENT_TIMESTAMP);
The above is what I've tried. I get an error and I don't know how else to do it.
Is there anyway I can do this or something similar? Side question, does the ON UPDATE trigger on a row that just got inserted?
The syntax you are trying to use doesn't exist. It looks like you are thinking of ON UPDATE CURRENT_TIMESTAMP but that is a rather specific command, as per https://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
Use of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP is
specific to TIMESTAMP.
So the ON UPDATE clause only works with CURRENT_TIMESTAMP and only on fields of type TIMESTAMP.
If you want to use the MD5 of the current timestamp either set a trigger, or just manually set the value (e.g. UPDATE users SET confirmation=MD5(CURRENT_TIMESTAMP()) WHERE user_id=123).
Bare in mind that the MD5 of the current timestamp is something that could be quite easily guessed / brute forced, so don't rely on it for security.
Use a universal unique identifier for this purpose. It's a 128-bit unique number; it's designed for this kind of thing.
It has a string representation that fits in 36 bytes.
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
You can generate these things in most programming languages. In MySQL you use the UUID() function to get one. Every time you call UUID(), you're guaranteed to get a new value.
Add a CHAR(36) column to your database, or just use your VARCHAR(40) column.
You can't use data definition language (ALTER TABLE) to declare ON UPDATE except for a native timestamp. You'll need application code to set your UUID values, just like you do for MD5(CURRENT_TIMESTAMP).

how to know the date of insertion of record in SQL

I am using phpMyAdmin for my project and I have a table without date/datetime field.
I am wondering if there's a way to know when I inserted each record on the database
While designing your database if you forgot to keep an extra field to store the insertion time of a row then you have only one option left to know the the insertion time.
But the condition is you must have binary logging enabled prior to it.
Reference
You may check if binary logging is enabled in your part by executing this query :
SHOW VARIABLES LIKE 'log_bin';
Further Note:
And from now on you may keep an extra field which will track the insertion time of each row.
Change your table design :
Add an extra field in your table with datatype "timestamp/datetime" with default value CURRENT_TIMESTAMP and on update CURRENT_TIMESTAMP.

Timestamp current time is great to record the user registration, but will it change when I update the user?

I have a users table in my mysql database and there I record the time user signed up by having a column timeOfUserSignup (or something like that) of the type TIMESTAMP and default is set to CURRENT_TIME.
But what will happen if I update that user's info. Will that column value change to the time when the update occurred?
No, it will not be changed on updates.
A default value will only be generated if you don't pass any value on table insertion. If you need to change a value on updates too, then you can use an additional trigger for that.

MySQL: Is there a way to automatically set datetime field to record creation timestamp?

I know there is TIMESTAMP data type that automatically updates to timestamp value when a record is updated, and I already have such column.
Besides that I'd like to have a column that automatically populates to NOW() (or CURRENT_TIMESTAMP) and never changes, but MySQL DEFAULT doesn't appear to support function calls.
Please post only pure MySQL answers. I know how to do it at application level.
EDIT: If there's no such feature - I'd appreciate to hear that.
EDIT2: MySQL version is 5.0.32
Use a trigger to set the default.
DELIMITER |
CREATE
TRIGGER trigger_name BEFORE INSERT ON tbl_name FOR EACH ROW
BEGIN
SET NEW.colname = NOW();
END;
|
Try this one, including the delimiter.
I'd like to have a column that automatically populates to NOW() (or CURRENT_TIMESTAMP) and never changes
By saying you'd like it to populate to NOW() it sounds like you're referring to the initial INSERT. If that's the case, can you just use that? Something like
INSERT INTO table (field1,field2,my_datetime) VALUES (1,'a',NOW())