Условное дублирование таблиц MySQL с помощью триггера - PullRequest
0 голосов
/ 29 июня 2018

Я хочу написать триггер в MySQL, который копирует table1 column1 в column2 column1 Но столбец table1 должен быть уникальным, а столбец table1 - дублируемым.

Любой предлагает мне, как условно синхронизировать эти две таблицы с помощью триггеров.

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете улучшить свой вопрос, указав, какой тип триггера вы хотите (вставить, обновить, удалить) и что вы хотите произойти, если будет найден дубликат. Предполагая, что вам нужен триггер вставки, а table2.id имеет уникальный ключ, вы можете использовать insert ignore, чтобы игнорировать ошибку и выбросить попытку вставки из table1, вы можете использовать insert..on duplicate key для обновления table2. Если table2.id не имеет уникального ключа, вы можете написать код, чтобы найти, будет ли ключ дублирован, а затем применить параметр вставки, который вы предпочитаете. Я предположил, что вы не просто хотите выбросить ошибку, если обнаружен дубликат. Вот пример кода и данных для вас.

DROP TABLE IF EXISTS TABLE1,TABLE2;
CREATE TABLE TABLE1(ID INT, VALUE INT);
CREATE TABLE TABLE2(ID INT PRIMARY KEY, VALUE INT);

DROP TRIGGER IF EXISTS T;
DELIMITER $$
CREATE TRIGGER T AFTER INSERT ON TABLE1
FOR EACH ROW
BEGIN
    INSERT IGNORE INTO TABLE2 VALUES (NEW.ID,NEW.VALUE);

END $$

INSERT INTO TABLE1 VALUES(1,1);
SELECT * FROM TABLE2;
INSERT INTO TABLE1 VALUES(1,2);
SELECT * FROM TABLE1;
SELECT * FROM TABLE2;

DROP TRIGGER IF EXISTS T;
DELIMITER $$
CREATE TRIGGER T AFTER INSERT ON TABLE1
FOR EACH ROW
BEGIN
    INSERT INTO TABLE2 VALUES (NEW.ID,NEW.VALUE)
        ON DUPLICATE KEY UPDATE VALUE = NEW.VALUE;

END $$

DELIMITER ;

SELECT * FROM TABLE2;
INSERT INTO TABLE1 VALUES(1,3);
SELECT * FROM TABLE1;
SELECT * FROM TABLE2;

DROP TRIGGER IF EXISTS T;
DELIMITER $$
CREATE TRIGGER T AFTER INSERT ON TABLE1
FOR EACH ROW
BEGIN
    DECLARE FOUND INT DEFAULT 0;
    SELECT  1 INTO FOUND FROM DUAL WHERE EXISTS(SELECT ID FROM TABLE2 WHERE ID = NEW.ID);
    IF FOUND = 0 THEN
        INSERT INTO TABLE2 VALUES (NEW.ID,NEW.VALUE);
    ELSE
        INSERT INTO TABLE2 VALUES (NEW.ID,NEW.VALUE)
        ON DUPLICATE KEY UPDATE VALUE = NEW.VALUE;
    END IF;

END $$

DELIMITER ;

SELECT * FROM TABLE2;
INSERT INTO TABLE1 VALUES(1,4),(2,1);
SELECT * FROM TABLE1;
SELECT * FROM TABLE2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...