Вы также можете использовать этот запрос без INGORE. При этом выбираются только строки, которых нет в table3, и выполняется вставка.
INSERT INTO T3 (FK_T1, T2Desc)
SELECT T2.FK_T1, t2.Desc
FROM T2 T2
JOIN T1 T1 ON T1.Id = T2.FK_T1
LEFT JOIN T3 T3 ON T2.FK_t1 = T3.FK_T1
WHERE T3.FK_T1 IS NULL;
SAMPLE см. fiddle
CREATE TABLE T1 (
Id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (Id)
);
CREATE TABLE T2 (
Id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
FK_T1 BIGINT(20) UNSIGNED NOT NULL,
`Desc` VARCHAR(10) NOT NULL,
PRIMARY KEY (Id),
UNIQUE KEY FK_T1 (FK_T1),
CONSTRAINT FK_T2_T1 FOREIGN KEY (FK_T1) REFERENCES T1 (Id)
);
CREATE TABLE T3 (
Id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
FK_T1 BIGINT(20) UNSIGNED NOT NULL,
T2Desc VARCHAR(10) NOT NULL,
PRIMARY KEY (Id),
UNIQUE KEY FK_T1 (FK_T1),
CONSTRAINT FK_T3_T1 FOREIGN KEY (FK_T1) REFERENCES T1 (Id)
);
add Строки
INSERT INTO T1 VALUES (11),(12);
INSERT INTO T2 VALUES (21, 11, 'desc 1'), (22, 12, 'desc 2');
INSERT INTO T3 VALUES (31, 11, 'desc 1');
Обновление T3
mysql> INSERT INTO T3 (FK_T1, T2Desc)
-> SELECT T2.FK_T1, T2.Desc
-> FROM T2 T2
-> JOIN T1 T1 ON T1.Id = T2.FK_T1
-> LEFT JOIN T3 T3 ON T2.FK_t1 = T3.FK_T1
-> WHERE T3.FK_T1 IS NULL;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
см. Результат
mysql> SELECT * FROM T3;
+----+-------+--------+
| Id | FK_T1 | T2Desc |
+----+-------+--------+
| 31 | 11 | desc 1 |
| 32 | 12 | desc 2 |
+----+-------+--------+
2 rows in set (0.00 sec)
mysql>
вставить новую строку и проверить
mysql> INSERT INTO T1 VALUES (33),(34);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> INSERT INTO T2 VALUES (41, 33, 'desc 33'), (51, 34, 'desc 34');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>
mysql> INSERT INTO T3 (FK_T1, T2Desc)
-> SELECT T2.FK_T1, T2.Desc
-> FROM T2 T2
-> JOIN T1 T1 ON T1.Id = T2.FK_T1
-> LEFT JOIN T3 T3 ON T2.FK_t1 = T3.FK_T1
-> WHERE T3.FK_T1 IS NULL;
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM T3;
+----+-------+---------+
| Id | FK_T1 | T2Desc |
+----+-------+---------+
| 31 | 11 | desc 1 |
| 32 | 12 | desc 2 |
| 33 | 33 | desc 33 |
| 34 | 34 | desc 34 |
+----+-------+---------+
4 rows in set (0.00 sec)
повторить запрос без таблиц
mysql> INSERT INTO T3 (FK_T1, T2Desc)
-> SELECT T2.FK_T1, T2.Desc
-> FROM T2 T2
-> JOIN T1 T1 ON T1.Id = T2.FK_T1
-> LEFT JOIN T3 T3 ON T2.FK_t1 = T3.FK_T1
-> WHERE T3.FK_T1 IS NULL;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>