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.
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)
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.
Vous pouvez créer des déclencheurs pour cela.
pour l'insertion
CREATE TRIGGER {trigger_name} BEFORE INSERT ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
CREATE TRIGGER my_trigger_name_1 BEFORE INSERT ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());
pour la mise à jour
CREATE TRIGGER {trigger_name} BEFORE UPDATE ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
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
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 .