50 votes

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

J'essaie de le faire, mais il semble que MySQL ne m'y autorise 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 un CURRENT_TIMESTAMP par défaut, mais mon client a insisté pour utiliser le temps d'époque dans la base de données.

63voto

Ike Walker Points 21162

La façon dont MySQL implémente le TIMESTAMP il s'agit en fait de stocker l'heure d'origine dans la base de données. Vous pourriez donc utiliser un TIMESTAMP avec une valeur par défaut de CURRENT_TIMESTAMP et appliquer le UNIX_TIMESTAMP() si vous voulez l'afficher comme un 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 régler via un déclencheur :

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)

20voto

Joe Stefanelli Points 72874

De la documentation :

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

10voto

Arjun Raj Points 473

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 l'actualisation

  • 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());

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

Veuillez consulter les liens suivants

  1. Identifiez certains des inconvénients de la mise en œuvre des déclencheurs du serveur SQL.

  2. Utilisation des déclencheurs

8voto

SG H Points 11

Comme La réponse de ktretyak Avec MySQL v8+, vous pouvez le faire en utilisant une parenthèse.

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

Après quelques insertions, vous pouvez voir qu'il fonctionne correctement.
(Testé sur MySQL 8.0.26 + correction de la couleur du texte uniquement)

tested case

Vous pouvez également utiliser une expression.
Vérifiez La réponse de ktretyak .

J'écris cette réponse au lieu de commenter ou de modifier la réponse (essayé et rejeté).
à cause du manque de RÉPUTATION et l'utilisation d'une parenthèse est une bonne solution maintenant.

5voto

Powerlord Points 43989

Eh bien, si MySQL ne vous permet pas de le faire directement, vous pouvez toujours le faire à l'aide d'un fichier BEFORE INSERT... FOR EACH ROW déclencher .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X