SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.12.2008 11:53:26

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

timestamp field

Странно, читаю в документации, что

For some data types, MySQL handles NULL values specially. If you insert NULL into a TIMESTAMP column, the current date and time is inserted. If you insert NULL into an integer or floating-point column that has the AUTO_INCREMENT attribute, the next number in the sequence is inserted.

То есть если я пишу null в колонку timestamp, то надеюсь там увидеть ненулевое значение. Этого я не вижу.

insert into dvsys_users(`userid`,`accountname`,`sid`,`timestamp`)
select uuid(),'g6',uuid(),NULL;

Если же я пытаюсь управлять сам созданием таймстампа, то я могу получить точность таймстампа только в пределах секунд текущего времени. Текущие микросекунды я не могу получить никоим образом.

insert into dvsys_users(`userid`,`accountname`,`sid`,`timestamp`)
select uuid(),'g5',uuid(),TIMESTAMP(curdate(),curtime());

Подскажите плз какую функцию я могу использовать, чтобы получить текущее значение микросекунд локального времени.
Пишется ли реальный таймстамп при записи нулл в поле с типом таймстамп?

И вообще MySql движок может ли самостоятельно или автоматически вести поля типа таймстамп, чтобы разработчик на это не заморачивался. Или меня заклинило и я не прав?

С уважением

Неактивен

 

#2 09.12.2008 12:17:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: timestamp field

TIMESTAMP хранится в секундах, поэтому миллисекунды не узнаете. NULL работает, более того, можно вообще не указывать эту колонку, текущий timestamp попадет в нее автоматически.

mysql> CREATE TABLE my (id int, t timestamp);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into my VALUES (1, NULL);
Query OK, 1 row affected (0.02 sec)

mysql> select * from my;
+------+---------------------+
| id   | t                   |
+------+---------------------+
|    1 | 2008-12-09 12:11:28 |
+------+---------------------+
1 row in set (0.00 sec)

Обратите внимание, что есть особенности - поле TIMESTAMP может быть определено так, что автоматически заполняться не будет.
mysql> SHOW CREATE TABLE my\G
*************************** 1. row ***************************
       Table: my
Create Table: CREATE TABLE `my` (
  `id` int(11) default NULL,
  `t` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

По умолчанию тип timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, но можно переопределить. Более того, только одно поле timestamp в каждой таблице может быть автозаполняемым.

Неактивен

 

#3 09.12.2008 14:37:15

Igor Panshin
Завсегдатай
Зарегистрирован: 04.06.2008
Сообщений: 62

Re: timestamp field

Да, спасибо
Я определял поле as timestamp null поэтому нулл не работал. Однако одна проблема осталась. Если я ввожу в таблицу подряд несколько строк, то таймстамп у них оказывается одинаково равный, что вообще говоря неверно и в этом видимо виновата точность хранения таймстампа до 1 секунды. То есть, чтобы обеспечить уникальность нужны микросекунды таймстампа, либо введение дополнительного поля например `num` int auto_increment. Так ли это?

Неактивен

 

#4 09.12.2008 14:58:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: timestamp field

Если Вас устроит любая уникальность, то - да, автоинкремент.  TIMESTAMP - это секунды, большую точность
вы из него не получите. Более того, даже в случае, если бы писались микросекунды, все равно была бы отличная
от нуля вероятность вставить две строки с одним временем.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson