Het hebben van zowel een gemaakte als laatst bijgewerkte tijdstempel in MySQL 4.0

Ik heb het volgende tabelschema;

CREATE TABLE `db1`.`sms_queue` (
  `Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
  `CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
  `Phone` VARCHAR(14) DEFAULT NULL,
  `Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  `TriesLeft` tinyint NOT NULL DEFAULT 3,
  PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;

Het mislukt met de volgende fout:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

Mijn vraag is, mag ik beide velden hebben? of moet ik handmatig een LastUpdated-veld instellen tijdens elke transactie?


Antwoord 1, autoriteit 100%

Uit de MySQL 5.5-documentatie :

Eén TIMESTAMP-kolom in een tabel kan de huidige tijdstempel hebben als de standaardwaarde voor het initialiseren van de kolom, als de waarde voor automatisch bijwerken, of beide. Het is niet mogelijk om de huidige tijdstempel als standaardwaarde voor de ene kolom en de automatische updatewaarde voor een andere kolom te gebruiken.

Wijzigingen in MySQL 5.6.5:

Voorheen kon maximaal één TIMESTAMP-kolom per tabel automatisch worden geïnitialiseerd of bijgewerkt naar de huidige datum en tijd. Deze beperking is opgeheven.Elke TIMESTAMP-kolomdefinitie kan elke combinatie van DEFAULT CURRENT_TIMESTAMP- en ON UPDATE CURRENT_TIMESTAMP-clausules hebben. Bovendien kunnen deze clausules nu worden gebruikt met DATETIME-kolomdefinities. Zie Automatische initialisatie en updates voor TIMESTAMP en DATETIME voor meer informatie.


Antwoord 2, autoriteit 65%

Er is een trucom beide te hebben tijdstempels, maar met een kleine beperking.

U kunt slechts één van de definities in één tabel gebruiken. Maak beide tijdstempelkolommen als volgt aan:

create table test_table( 
  id integer not null auto_increment primary key, 
  stamp_created timestamp default '0000-00-00 00:00:00', 
  stamp_updated timestamp default now() on update now() 
); 

Houd er rekening mee dat het nodig is om nullin beide kolommen in te voeren tijdens insert:

mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); 
Query OK, 1 row affected (0.06 sec)
mysql> select * from test_table; 
+----+---------------------+---------------------+ 
| id | stamp_created       | stamp_updated       |
+----+---------------------+---------------------+
|  2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)  
mysql> update test_table set id = 3 where id = 2; 
Query OK, 1 row affected (0.05 sec) Rows matched: 1  Changed: 1  Warnings: 0  
mysql> select * from test_table;
+----+---------------------+---------------------+
| id | stamp_created       | stamp_updated       | 
+----+---------------------+---------------------+ 
|  3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 | 
+----+---------------------+---------------------+ 
2 rows in set (0.00 sec)  

Antwoord 3, autoriteit 20%

Je kunt ze allebei hebben, verwijder gewoon de “CURRENT_TIMESTAMP”-vlag op het gemaakte veld. Telkens wanneer u een nieuw record in de tabel aanmaakt, gebruikt u gewoon “NOW()” voor een waarde.

Of.

Integendeel, verwijder de vlag ‘ON UPDATE CURRENT_TIMESTAMP’ en verzend de NOW() voor dat veld. Op die manier is het eigenlijk logischer.


Antwoord 4, autoriteit 20%

Als u besluit om MySQL de update van tijdstempels te laten afhandelen, kunt u een trigger instellen om het veld bij invoegen bij te werken.

CREATE TRIGGER <trigger_name> BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.<timestamp_field> = CURRENT_TIMESTAMP;

MySQL-referentie: http://dev.mysql.com/doc /refman/5.0/en/triggers.html


Antwoord 5, autoriteit 17%

Dit is hoe je automatische & flexibele createDate/lastModified-velden met behulp van triggers:

Definieer ze eerst als volgt:

CREATE TABLE `entity` (
  `entityid` int(11) NOT NULL AUTO_INCREMENT,
  `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `name` varchar(255) DEFAULT NULL,
  `comment` text,
  PRIMARY KEY (`entityid`),
)

Voeg vervolgens deze triggers toe:

DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
  • Als u invoegtzonder createDate of lastModified op te geven, zijn ze gelijk aan en ingesteld op de huidige tijdstempel.
  • Als u ze bijwerktzonder createDate of lastModified op te geven, wordt de lastModified ingesteld op de huidige tijdstempel.

Maar hier is het leuke:

  • Als u invoegt, kunt u een createDate opgeven die ouder is dan de huidige tijdstempel, zodat importen uit oudere tijden goed kunnen werken (lastModified is gelijk aan createDate).
  • Als u bijwerkt, kunt u een lastModified ouder dan de vorige waardespecificeren (‘0000-00-00 00:00:00’ werkt goed), waardoor werk een item bij als je cosmetische wijzigingen aanbrengt (een typfout in een opmerking corrigeren) en je wilt de oude lastModified-datum behouden. Dit zal de datum van de laatste wijziging niet wijzigen.

Antwoord 6, autoriteit 16%

Vanaf MySQL 5.6 is het makkelijk… probeer het eens:

create table tweet ( 
    id integer not null auto_increment primary key, 
    stamp_created timestamp default now(), 
    stamp_updated timestamp default now() on update now(),
    message varchar(163)
)

Antwoord 7, autoriteit 3%

Dit probleem leek te zijn opgelost in MySQL 5.6. Ik heb dit gemerkt tot MySQL 5.5; hier is een voorbeeldcode:

DROP TABLE IF EXISTS `provider_org_group` ;
CREATE TABLE IF NOT EXISTS `provider_org_group` (
  `id` INT NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  `type` VARCHAR(100) NULL,
  `inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `insert_src_ver_id` INT NULL,
  `updated` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
  `update_src_ver_id` INT NULL,
  `version` INT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;

Dit uitvoeren op MySQL 5.5 geeft:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Dit uitvoeren op MySQL 5.6

0 row(s) affected   0.093 sec

Antwoord 8, autoriteit 3%

create table test_table( 
id integer not null auto_increment primary key, 
stamp_created timestamp default '0000-00-00 00:00:00', 
stamp_updated timestamp default now() on update now() 
); 

bron: http://gusiev.com/2009/04/update-and-create- tijdstempels-met-mysql/


Antwoord 9, autoriteit 2%

ik denk dat dit de betere zoekopdracht is voor stamp_created en stamp_updated

CREATE TABLE test_table( 
    id integer not null auto_increment primary key, 
    stamp_created TIMESTAMP DEFAULT now(), 
    stamp_updated TIMESTAMP DEFAULT '0000-00-00 00:00:00' ON UPDATE now() 
); 

omdat wanneer de record is gemaakt, stamp_createdmoet worden gevuld met now()en stamp_updatedmoet worden gevuld met '0000-00-00 00:00:00'


Antwoord 10

Voor mysql 5.7.21 gebruik ik het volgende en werkt prima:

MAAK TABEL Posts(
modified_attijdstempel NIET NULL STANDAARD CURRENT_TIMESTAMP BIJ UPDATE CURRENT_TIMESTAMP,
created_attijdstempel NIET NULL STANDAARD CURRENT_TIMESTAMP
)


Antwoord 11

Mijn webhost zit vast op versie 5.1 van mysql, dus iedereen zoals ik die niet de mogelijkheid heeft om te upgraden, kan deze instructies volgen:

http://joegornick.com/ 30/12/2009/mysql-created-and-modified-date-fields/


Antwoord 12

dit voegt twee kolommen toe voor het maken en bijwerken.
beide worden bijgewerkt tijdens het invoegen en bijwerken.

  create table users( 
      id integer not null auto_increment primary key, 
      created_date timestamp default now(), 
      modified_date timestamp default now() on update now() 
    ); 

Other episodes