2009-09-01 9 views
1

Ma recherche préliminaire dit "non". J'ai une application de base de données dans SQL Server qui utilise la colonne d'horodatage SQL Server pour suivre les modifications .... c'est-à-dire, je peux parcourir la table et savoir que si je vois un horodatage> qu'un horodatage de référence, la ligne a été ajoutée ou mise à jour.Existe-t-il une fonctionnalité MySQL comme la colonne TIMESTAMP de SQL Server?

Je cherche un type comme ça dans MySQL. Cela ne semble pas exister. Donc, vais-je devoir répliquer cette fonctionnalité en utilisant soit des déclencheurs (bon) ou de la logique d'application (mauvaise)? Notez que l'utilisation de TIMESTAMP de MySQL n'est pas vraiment une bonne solution, car elle n'est pas toujours unique, et n'augmente pas de manière monotone au fil du temps.

EDIT --- Voici le scénario que je me sers de ces derniers pour, depuis des années ...

J'ai une table dans un système OLTP qui est l'état actuel de l'inventaire. J'ai une interface graphique frontale qui affiche différentes vues de l'inventaire. J'aimerais parfois demander à la base de données "quelles lignes sont nouvelles/modifiées". Avec TIMESTAMP/ROWVERSION de SQL Server, je pourrais le faire facilement. Si j'utilise un type de date réel, je rencontrerais toujours des problèmes où j'ai reçu une mise à jour plus d'une fois (pas un gros désastre), ou parfois manqué une mise à jour (un désastre).

+0

Il n'est pas garanti que l'horodatage/l'alignement de ligne soit unique. il peut être dupliqué si vous essayez de faire insérer plusieurs lignes en utilisant select –

Répondre

5

Je ne suis pas sûr de comprendre pourquoi cela ne fonctionne pas pour votre scénario. TIMESTAMP est-il garanti d'être unique dans MS SQL Server?

Aha - Je vois dans timestamp SQL Server est synonyme de rowversion qui est un peu comme de AUTO_INCREMENT MySQL sauf qu'il génère une nouvelle augmentation de la valeur de façon monotone sur UPDATE ainsi que sur INSERT.

Non, MySQL n'a rien de tel. MySQL ne supporte pas non plus un objet SEQUENCE comme Oracle ou PostgreSQL ou IBM DB2. Une séquence vous permettrait de générer une nouvelle valeur à partir d'un déclencheur, par exemple. J'ai lu votre information mise à jour dans votre question, donc je comprends le problème que vous essayez de résoudre.

Ce que j'ai vu comme une solution alternative est d'ajouter un autre attribut dans la table que vous traitez, appelez-le is_processed ou quelque chose. Entrez une valeur NULL lorsque vous insérez une nouvelle ligne. Lorsque vous êtes en train de le traiter, modifiez la valeur de cette colonne à 1. Ensuite, vous saurez toujours quelles lignes vous avez encore à traiter - elles seront les lignes où is_processed IS NULL.


Re votre commentaire: D'accord, je vois le problème. Chaque utilisateur a besoin de sa propre vue des lignes qui sont nouvelles/modifiées.

Un autre hack que j'ai vu utilisé dans MySQL pour simuler un objet séquence est une table qui contient une clé primaire auto-incrémentée et rien d'autre. Vous pouvez générer de nouvelles valeurs monotones croissantes uniques en les insérant dans cette table, puis restaurer l'insertion.

CREATE TABLE sequence (id SERIAL) ENGINE=InnoDB; -- Must be InnoDB 

START TRANSACTION; 
INSERT INTO sequence() VALUES(); -- Yes this is a legal statement. 
ROLLBACK; 

SELECT LAST_INSERT_ID(); 

Vous ne pouvez pas commencer et les opérations d'annulation dans un déclencheur MySQL, vous devrez générer les nouvelles valeurs dans votre code d'application. Ou alors, vous pouvez passer à PostgreSQL et obtenir un réel support pour les séquences.

+0

Right .... Je pense que je peux reproduire la fonctionnalité, mais c'est une douleur dans le cul. –

+0

"Ce que j'ai vu comme une solution alternative est d'ajouter un autre attribut dans la table que vous traitez, appelez-le is_processed ou quelque chose comme ça." Cela ne fonctionnera pas ... en supposant qu'il y ait une table, mais de nombreux utilisateurs de l'interface graphique. –

+0

Vous pouvez émuler une séquence dans mysql comme ici http://forums.mysql.com/read.php?61,143867,194058#msg-194058. Et vous pouvez l'utiliser dans un déclencheur BEFORE UPDATE/BEFORE INSERT pour mettre à jour une colonne de version personnalisée que vous devrez ajouter à votre table. (Et oui, c'est très très douloureux) – nos

-1

Si le problème monotonicity est dû à l'heure d'été, vous pouvez définir le fuseau horaire UTC lors de la vérification des colonnes timestamp:

SET time_zone = timezone; 

Sinon, vous pouvez remplir des colonnes datetime avec UTC_TIMESTAMP en utilisant des déclencheurs. Malheureusement, aucune idée ne renforce l'unicité et n'empêche pas les conditions de concurrence avec les transactions.

+0

Je suppose qu'il y a aussi un problème avec l'unicité si vous mettez à jour plusieurs lignes dans une seule instruction 'UPDATE'. L'horodatage d'une mise à jour est identique pour toutes les lignes mises à jour par la même instruction. –

Questions connexes