我有一个查询来更新表2中的表1
Insert into Table1 (Column A, Column B, Column C,Column D)
Select Column A, Column B, Column C, Column D from Table 2
我想运行这是一个cron,以便在表1中添加新记录时更新表2。但是我不希望按照A-C列的定义进行重复。
我想如果我使用A列,B列,C列在表2中创建了一个唯一索引,它就不会添加新记录,除非它们不存在这三列但我得到的只是一个错误
存在重复条目'列A列B列C'用于键'唯一'
无论如何设置它以便只从cron更新新记录?
答案 0 :(得分:1)
您可以使用LEFT JOIN
并根据您的3列仅插入表1中不存在的记录:
INSERT INTO Table1 (ColumnA, ColumnB, ColumnC,ColumnD)
SELECT t2.ColumnA, t2.ColumnB, t2.ColumnC, t2.ColumnD
FROM Table2 t2
LEFT JOIN Table1 t1
ON t1.ColumnA = t2.ColumnA
AND t1.ColumnB = t2.ColumnB
AND t1.ColumnC = t2.ColumnC
WHERE t1.ColumnA IS NULL;
的 SqlFiddleDemo
强>
我认为ColumnA-C
是复合PRIMARY KEY
。
修改强>
您可以使用MySQL
INSERT IGNORE
:
INSERT IGNORE INTO Table1 (ColumnA, ColumnB, ColumnC,ColumnD)
SELECT t2.ColumnA, t2.ColumnB, t2.ColumnC, t2.ColumnD
FROM Table2 t2;
的 SqlFiddleDemo2
强>
如果您需要使用较新的值更新其余列,您可以使用:
INSERT INTO Table1 (ColumnA, ColumnB, ColumnC,ColumnD)
SELECT t2.ColumnA, t2.ColumnB, t2.ColumnC, t2.ColumnD
FROM Table2 t2
ON DUPLICATE KEY UPDATE ColumnD = VALUES(ColumnD);
的 SqlFiddleDemo3
强>
还有REPLACE INTO
(较慢并将删除旧记录+插入新记录):
REPLACE INTO Table1 (ColumnA, ColumnB, ColumnC,ColumnD)
SELECT t2.ColumnA, t2.ColumnB, t2.ColumnC, t2.ColumnD
FROM Table2 t2
的 SqlFiddleDemo4
强>
答案 1 :(得分:0)
如果您的任何列具有唯一值(例如,列A是您的PRIMARY KEY),您可以使用:
INSERT INTO table1 (Column_A, Column_B, Column_C, Column_D)
SELECT Column_A, Column_B, Column_C, Column_D
FROM table2
WHERE column_A NOT IN (
SELECT column_A FROM table1
);
此语句将向table1条目中插入table2的Column_A值,这些值在table1的Column_A中不存在。