Я хочу написать триггер в MySQL, который скопирует table1s column1 в столбец table2s1. Столбец table2s1 должен быть уникальным, table1s column1 дублируется.
Любой из нас предлагает мне условно синхронизировать между этими двумя таблицами с помощью триггеров.
Вы можете улучшить свой вопрос, указав, какой тип триггера вы хотите (вставить, обновить, удалить) и что вы хотите, если найден дубликат. Предполагая, что вы хотите, чтобы триггер 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;