web-dev-qa-db-fra.com

Est-il possible de créer une colonne avec un défaut UNIX_TIMESTAMP dans MySQL?

J'essaie de le faire, mais il semble que MySQL ne me le permette pas. Existe-t-il une solution à ce problème ou dois-je toujours inclure la fonction dans mes requêtes INSERT?

CREATE TABLE foo(
  created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)

Je connais le type TIMESTAMP qui accepte une valeur par défaut CURRENT_TIMESTAMP, mais mon client a insisté pour utiliser le temps Epoch dans la base de données.

36
Kit Sunde

La façon dont MySQL implémente le type de données TIMESTAMP, il stocke en fait l'heure Epoch dans la base de données. Vous pouvez donc simplement utiliser une colonne TIMESTAMP avec une valeur par défaut de CURRENT_TIMESTAMP Et lui appliquer la UNIX_TIMESTAMP() si vous souhaitez l'afficher en tant qu'int:

CREATE TABLE foo(
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

insert into foo values (current_Date()),(now());

select unix_timestamp(created) from foo;
+-------------------------+
| unix_timestamp(created) |
+-------------------------+
|              1300248000 |
|              1300306959 |
+-------------------------+
2 rows in set (0.00 sec)

Cependant, si vous voulez vraiment que le type de données de la colonne soit INT, vous pouvez utiliser la suggestion de R. Bemrose et le définir via trigger:

CREATE TABLE foo(
  created INT NULL
);

delimiter $$

create trigger tr_b_ins_foo before insert on foo for each row
begin
  if (new.created is null)
  then
    set new.created = unix_timestamp();
  end if;
end $$

delimiter ;


insert into foo values (unix_timestamp(current_Date())), (null);

select created from foo;
+------------+
| created    |
+------------+
| 1300248000 |
| 1300306995 |
+------------+
2 rows in set (0.00 sec)
51
Ike Walker

De la documentation :

À une exception près, la valeur par défaut doit être une constante; ce ne peut pas être une fonction ou une expression. Cela signifie, par exemple, que vous ne pouvez pas définir la valeur par défaut pour une colonne de date comme étant la valeur d'une fonction telle que NOW () ou CURRENT_DATE. L'exception est que vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut pour une colonne TIMESTAMP.

19
Joe Stefanelli

Vous pouvez créer des déclencheurs pour cela.

pour l'insertion

  • requête

CREATE TRIGGER {trigger_name} BEFORE INSERT ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());

  • dans ce cas

CREATE TRIGGER my_trigger_name_1 BEFORE INSERT ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());

pour la mise à jour

  • requête

CREATE TRIGGER {trigger_name} BEFORE UPDATE ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());

  • dans ce cas

CREATE TRIGGER my_trigger_name_2 BEFORE UPDATE ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());

Remarque: Je n'ai aucune idée des performances de MYSQL TRIGGER

Veuillez passer par ces liens

  1. Identifiez certains des inconvénients de l'implémentation des déclencheurs du serveur SQL

  2. tilisation de déclencheurs

8
Arjun Raj

Eh bien, si MySQL ne vous laisse pas le faire directement, vous pouvez toujours le faire en utilisant un BEFORE INSERT... FOR EACH ROW trigger .

4
Powerlord