Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用唯一值从一个表插入到另一个表_Mysql_Sql_Insert_Unique - Fatal编程技术网

Mysql 使用唯一值从一个表插入到另一个表

Mysql 使用唯一值从一个表插入到另一个表,mysql,sql,insert,unique,Mysql,Sql,Insert,Unique,我有一个从表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列定义的重复项 我想,如果我在表2中使用列a、列B、列C创建一个唯一的索引,它将不会添加新记录,除非它们不存在于这三列中,但我得到的只是一个错误 键“U

我有一个从表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列定义的重复项

我想,如果我在表2中使用列a、列B、列C创建一个唯一的索引,它将不会添加新记录,除非它们不存在于这三列中,但我得到的只是一个错误

键“Unique”的“A列-B列-C列”存在重复条目


是否仍要设置此选项,以便仅从cron更新新记录?

您可以使用
左连接
并根据您的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;

我假设
ColumnA-C
是复合
主键

编辑:

您可以使用MySQL:

如果需要使用较新的值更新其余列,可以使用:

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);
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
);

还有(速度较慢,将删除旧记录并插入新记录):


如果您的任何列具有唯一值(例如,A列是您的主键),您可以使用:

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);
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
);

此语句将在表1中插入具有表2第A列值的条目,这些值在表1第A列中不存在。

再次考虑此项吗?@草莓
关于重复密钥更新…
?忽略我see@Strawberry但是有一个很好的网站。学习新东西:)