I agree, since it makes sense, but it _may_ make porting some MySQL apps
harder.

Mark Atwood wrote:
> +1
> 
> On Feb 16, 2009, at 4:10 PM, Jay Pipes wrote:
> 
>> All,
>>
>> Has anyone ever been completely confused by MySQL's handling of
>> TIMESTAMP columns?  I know I have.
>>
>> For a primer, read here:
>>
>> http://dev.mysql.com/doc/refman/6.0/en/timestamp.html
>>
>> In an effort NOT to go down a rathole but to refactor the server's
>> handling of TIMESTAMP columns to be less "magic" and more explicit,
>> here is my proposed change in behaviour.  Please vote!
>>
>> Currently, there is some "magic" in the way one can define TIMESTAMP
>> columns in MySQL.  The magic occurs for the *first* TIMESTAMP column
>> that is defined without any DEFAULT or ON UPDATE clause, like so:
>>
>> CREATE TABLE t1 (
>> ts1 TIMESTAMP
>> );
>>
>> What the above does silently is convert that timestamp column's
>> definition to this:
>>
>> CREATE TABLE t1 (
>> ts1 TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
>> );
>>
>> The reason for this is for backwards compatibility with Unireg,
>> MyISAM's predecessor.  The above magic, implicit definition is
>> implemented as a hack in the server (namely, in prepare_create_field()
>> and in the parser itself.  It's a hack that I would prefer to get rid
>> of (and I know Stewart would as well, since this would allow us to get
>> rid of the unireg_check argument for Field creation...)
>>
>> If you've ever run into the following behaviour, you've probably
>> scratched your head at the error message.  The reason is because many
>> users try to execute something like the following:
>>
>> mysql> CREATE TABLE t1 (
>>    ->  some_time TIMESTAMP
>>    -> , update_time TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
>>    -> );
>> ERROR 1293 (HY000): Incorrect table definition; there can be only one
>> TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
>>
>> Looking at the error, many users think "but I *did* specify only a
>> single column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause!!"
>>
>> So, in concrete terms, here is my proposal to change the behaviour of
>> TIMESTAMP columns:
>>
>> a) If a user specifies TIMESTAMP with no DEFAULT or ON UPDATE clause,
>> the TIMESTAMP column will *always* be defined as TIMESTAMP NULL, with
>> no magic happening behind the scenes.
>>
>> b) Users must always explicitly specify what they wish the TIMESTAMP
>> column's behaviour on insert and update.  This means:
>>
>> b1) To specify a TIMESTAMP column which sets itself to NOW() when a
>> record is inserted, but does NOT set itself to some value on update
>> automatically, do:
>>
>> CREATE TABLE t1 (
>>  ts TIMESTAMP DEFAULT NOW()
>> );
>>
>> b2) To specify a TIMESTAMP column which sets itself to NOW() when a
>> record is updated, but does NOT set itself to some value on insert, do:
>>
>> CREATE TABLE t1 (
>>  ts TIMESTAMP NULL ON UPDATE NOW()
>> );
>>
>> b3) To specify a TIMESTAMP column which sets itself to NOW() when a
>> record is inserted, and ALSO sets itself to NOW() on update
>> automatically, do:
>>
>> CREATE TABLE t1 (
>>  ts TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
>> );
>>
>> b4) The final variation on this would be:
>>
>> CREATE TABLE t1 (
>>  ts TIMESTAMP NOT NULL ON UPDATE NOW()
>> );
>>
>> This would be for timestamp columns that, as a user, you wish to
>> manually set to a value on INSERT (and *be forced to set this value*)
>> and on update, have the column set itself to NOW()
>>
>> As far as I can tell, this proposal would be inline with 99% of
>> MySQL's timestamp behaviour with the sole exception of no magic on the
>> first TIMESTAMP column with no DEFAULT and ON UPDATE clause.
>>
>> Votes please!
>>
>> Thanks,
>>
>> Jay
>>
>> p.s. Stewart: if this proposal goes through, we can get rid of
>> unireg_check and the associated stuff in unireg.cc:pack_screens() and
>> pack_header() this week...
>>
>> _______________________________________________
>> Mailing list: https://launchpad.net/~drizzle-discuss
>> Post to     : [email protected]
>> Unsubscribe : https://launchpad.net/~drizzle-discuss
>> More help   : https://help.launchpad.net/ListHelp
> 


_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to