插入新记录时从另一个表插入表

时间:2017-03-10 18:38:06

标签: python sql

我有2个表,如果记录不存在,我想将第一个表中的所有记录插入到第二个表中。如果在第一个表中添加了新行,则必须将其插入到第二个表中。

我找到了这个查询 INSERT INTO Table2 SELECT * FROM Table1 WHERE NOT EXISTS(SELECT * FROM Table2) 但是如果向table1添加了新行,则该行不会插入到table2中。

PS:table1和table2具有相同的字段并包含数千条记录

2 个答案:

答案 0 :(得分:0)

你可以在SQL中完成所有操作 - 例如,你可以每2分钟运行一次批处理......

-- with these two tables and their contents ...
DROP TABLE IF EXISTS tableA;
CREATE TABLE IF NOT EXISTS tableA(id,name,dob) AS (
          SELECT 42,'Arthur Dent',DATE '1957-04-22'
UNION ALL SELECT 43,'Ford Prefect',DATE '1900-08-01'
UNION ALL SELECT 44,'Tricia McMillan',DATE '1959-03-07'
UNION ALL SELECT 45,'Zaphod Beeblebrox',DATE '1900-02-01'
);
ALTER TABLE tableA ADD CONSTRAINT pk_A PRIMARY KEY(id);

DROP TABLE IF EXISTS tableB;
CREATE TABLE IF NOT EXISTS tableB(id,name,dob) AS (
          SELECT 43,'Ford Prefect',DATE '1900-08-01'
UNION ALL SELECT 44,'Tricia McMillan',DATE '1959-03-07'
UNION ALL SELECT 45,'Zaphod Beeblebrox',DATE '1900-02-01'
);
ALTER TABLE tableB ADD CONSTRAINT pk_B PRIMARY KEY(id);

-- .. this MERGE statement will ad the row with id=42 to table B ..

MERGE
INTO tableB t
USING tableA s
 ON s.id   = t.id
WHEN NOT MATCHED THEN INSERT (
  id
, name
, dob
) VALUES (
  s.id
, s.name
, s.dob
);

答案 1 :(得分:0)

所以这是一个Access数据库。

运气好。他们没有触发器。

那么好吧。我想你知道如何使用Python在Access中插入一行,所以我不会经历这一点。

我只是在插入一行之后构建一个场景。

CREATE TABLE tableA (
  id   INTEGER
, name VARCHAR(20)
, dob  DATE
, PRIMARY KEY  (id)
)
;
INSERT INTO tableA(id,name,dob) VALUES(42,'Arthur Dent','1957-04-22');
INSERT INTO tableA(id,name,dob) VALUES(43,'Ford Prefect','1900-08-01');
INSERT INTO tableA(id,name,dob) VALUES(44,'Tricia McMillan','1959-03-07');
INSERT INTO tableA(id,name,dob) VALUES(45,'Zaphod Beeblebrox','1900-02-01');

CREATE TABLE tableB (
  id   INTEGER
, name VARCHAR(20)
, dob  DATE
, PRIMARY KEY  (id)
)
;
INSERT INTO tableB(id,name,dob) VALUES(43,'Ford Prefect','1900-08-01');
INSERT INTO tableB(id,name,dob) VALUES(44,'Tricia McMillan','1959-03-07');
INSERT INTO tableB(id,name,dob) VALUES(45,'Zaphod Beeblebrox','1900-02-01');

确定。场景准备就绪。

合并....

MERGE
INTO tableB t
USING tableA s
 ON s.id   = t.id
WHEN NOT MATCHED THEN INSERT (
  id
, name
, dob
) VALUES (
  s.id
, s.name
, s.dob
);

42000:1:-3500:[Microsoft][ODBC Microsoft Access Driver] 
Invalid SQL statement; 
expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

所以,Merge不受支持。

尝试别的东西:

INSERT INTO tableB
SELECT * FROM tableA
WHERE id <> ALL (SELECT id FROM tableB)
;

1 row inserted

或者:

-- UNDO the previous insert
DELETE FROM tableB WHERE id=42;
1 row deleted
-- retry ...
INSERT INTO tableB
SELECT * FROM tableA
WHERE id NOT IN (SELECT id FROM tableB)
;
1 row inserted

你可以像上面这样运行它。

或者,如果从Python中插入表A,那么:

INSERT INTO tableA(id,name,dob) VALUES(?,?,?);

...并且您通过主机变量提供了id,name和dob的值, 你可以继续:

INSERT INTO tableB 
SELECT * FROM tableA a 
WHERE id=? 
  AND NOT EXISTS(
   SELECT * FROM tableB WHERE id=a.id
  );

您在第一个主变量中仍然具有值42,并且可以重复使用它。在单行插入的情况下,这种方式会更快。

如果您执行批量插入,那么我会将所有新行插入表A,然后运行INSERT ... WHERE ... NOT ININSERT ... WHERE id <> ALL ....