„on update CURRENT_TIMESTAMP“ für nur eine Spalte in mysql

Ich habe eine Tabelle test mit 4 Spalten

id     name   visited      updated_at
1      abc    2016-03-20   2016-03-20 
2      xyz    2016-03-23   2016-03-23

Wenn ich bewarb mich unter Abfrage

ALTER TABLE `test` CHANGE `updated_at` `updated_at` TIMESTAMP on update 
CURRENT_TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00'; 

Es ändern, updated_at wenn ich name oder visited,

Aber ich will Es ändert sich nur, wenn visited änderungen.

Wie Sie diese erreichen ? vielen Dank für Ihre Hilfe.



2 Replies
  1. 0
    drop table if exists `xyz1`;
    create table `xyz1`
    (   id int auto_increment primary key,
        theName varchar(20) not null,
        visited timestamp null, 
        updated_at timestamp null
    );
    insert `xyz1` (theName) values('abc'),('xyz');

    Er ist unglücklich über unsere aktuellen Nullen sitzen in es, Fehler 1138:

    ALTER TABLE `xyz1` CHANGE `updated_at` `updated_at` TIMESTAMP 
    NOT NULL DEFAULT CURRENT_TIMESTAMP; 

    Let ‚ s fix, dass:

    truncate table `xyz1`;
    
    ALTER TABLE `xyz1` CHANGE `updated_at` `updated_at` TIMESTAMP 
    DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 
    -- works
    
    insert `xyz1` (theName) values('abc'),('xyz');
    select * from `xyz1`;
    +----+---------+---------+---------------------+
    | id | theName | visited | updated_at          |
    +----+---------+---------+---------------------+
    |  1 | abc     | NULL    | 2016-06-16 14:39:38 |
    |  2 | xyz     | NULL    | 2016-06-16 14:39:38 |
    +----+---------+---------+---------------------+
    
    
    update `xyz1` set `theName`='xyz Smith' where id=2;
    select * from `xyz1`;
    +----+-----------+---------+---------------------+
    | id | theName   | visited | updated_at          |
    +----+-----------+---------+---------------------+
    |  1 | abc       | NULL    | 2016-06-16 14:39:38 |
    |  2 | xyz Smith | NULL    | 2016-06-16 14:41:04 |
    +----+-----------+---------+---------------------+

    Finden Sie im Handbuch Automatische Initialisierung und Aktualisierung

    • Wie ist das eine Antwort? Der OP will die updated_at wird aktualisiert, wenn visited wird nur aktualisiert.
  2. 2

    Klingt wie Sie einen trigger, um zu erreichen, dass. Vorausgesetzt, Ihr Tabellendefinition sieht so aus:

    drop table if exists test;
    create table test(
      id BIGINT(20) PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(255) NOT NULL DEFAULT '',
      visited DATETIME NOT NULL DEFAULT '0000-00-00',
      updated_at DATETIME NOT NULL DEFAULT '0000-00-00'
    );

    … können Sie erreichen Ihr Ziel der Aktualisierung updated_at nur für die visited Spalte mit einem trigger, wie so.

    -- Create a trigger that will update the updated_at column iff visited changes.
    drop trigger if exists upd_test;
    delimiter //
    create trigger upd_test BEFORE UPDATE ON test
    FOR EACH ROW
    BEGIN
      IF (  (old.visited is not null and new.visited is not null and old.visited <> new.visited)
          OR (old.visited is null and new.visited is not null)
          OR (old.visited is not null and new.visited is null)  ) THEN
        SET NEW.updated_at = CURRENT_TIMESTAMP;
      END IF;
    END;//
    delimiter ;

    Und Sie können sehen, es funktioniert mit einer relativ straight-forward-Beispiel.

    insert into test(name) values ("Bran"), ("Catelyn"), ("Daenerys"), ("Eddard");
    
    -- this statement will not cause updated_at to be updated
    update test
    set name = 'Jon'
    where name = 'Eddard';
    
    -- this statement will cause updated_at to be updated, via the trigger
    update test
    set visited = '2016-06-16'
    where name = 'Jon';
    • Übrigens, sorry, wenn das bedingte in der trigger sieht ein wenig wackelig. Für einige Grund, die null-safe-operator (<=>) nicht schneiden, und ich hatte manuell zu überprüfen und zu verarbeiten, die null-Werte. Nicht schön, aber es funktioniert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.