Условное дублирование таблиц MySQL с помощью триггера

0

Я хочу написать триггер в MySQL, который скопирует table1s column1 в столбец table2s1. Столбец table2s1 должен быть уникальным, table1s column1 дублируется.

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

  • 0
    Столбец 1 таблицы 2 имеет уникальный ключ?
  • 0
    Нет. Я попытался установить столбец 1 t2 как уникальный ключ и использовать триггер для копирования содержимого -> столбец 1 t1 не может импортировать данные.
Теги:
triggers

1 ответ

0
Лучший ответ

Вы можете улучшить свой вопрос, указав, какой тип триггера вы хотите (вставить, обновить, удалить) и что вы хотите, если найден дубликат. Предполагая, что вы хотите, чтобы триггер insert и table2.id имели уникальный ключ, вы можете использовать ignore ignore, чтобы игнорировать ошибку и выбросить попытку вставки из таблицы1, вы можете использовать insert..on duplicate key для обновления таблицы2. Если 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню