Maison  >  Questions et réponses  >  le corps du texte

Utilisez des déclencheurs pour générer des horodatages Unix lors de l'insertion tout en permettant le clonage des enregistrements existants et en évitant la duplication

Je crée un système d'événements. Disons qu'il y a un événement appelé « Go Dance » le 12 septembre 2022.

Lorsqu'un événement est ajouté à la base de données, nous créons un horodatage unix sur l'une des lignes. Nous utilisons le unix_timestamp() par défaut pour ce faire

Cet horodatage (par exemple 654213987) est utilisé dans le cadre de l'URL afin que les gens puissent s'inscrire à l'événement 654213987. Par exemple, les gens peuvent s'inscrire ici. http://myevents/signup/654213987

L'organisateur de l'événement a rédigé la description de l'événement le 12 septembre 2022.

L'organisateur de l'événement souhaite organiser le même événement l'année prochaine mais ne veut pas réécrire la description. Copiez ou clonez simplement le fichier original sans le supprimer.

Cela se fait facilement par programme en PHP, mais j'utilise XCRUD et je ne peux pas le modifier, donc mes seules options sont d'utiliser des déclencheurs ou une partie câblée de MYSQL.

Lorsque XCRUD effectue une copie, il utilise un INSERT normal contenant la copie originale moins la copie principale.

Si je rends la colonne unique, cela ne permet pas le clonage. Sinon, il copie l'horodatage.

Est-il possible de créer un déclencheur (ou un autre mécanisme) pour reconnaître qu'un doublon existe et remplacer le doublon par un autre nouvel horodatage ?

J'ai vu sur stackoverflow que vous pouvez ajouter des horodatages à l'aide de déclencheurs, mais je ne sais tout simplement pas comment le faire pour éviter la duplication.

P粉947296325P粉947296325283 Il y a quelques jours330

répondre à tous(1)je répondrai

  • P粉057869348

    P粉0578693482024-01-11 13:58:13

    Exemple.

    CREATE TABLE test (id INT, ts DATE);
    CREATE TRIGGER tr_bi_test_add_1_week
    BEFORE INSERT ON test
    FOR EACH ROW
    BEGIN
        WHILE EXISTS ( SELECT NULL
                       FROM test
                       WHERE ts = NEW.ts ) DO
            SET NEW.ts = NEW.ts + INTERVAL 1 WEEK;
        END WHILE;
    END
    INSERT INTO test VALUES (1, '2022-01-01'); 
    -- inserted as-is
    SELECT * FROM test;
    id ts
    1 2022-01-01

    répondre
    0
  • Annulerrépondre