Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
Python 插入新记录时从另一个表插入到表中_Python_Sql - Fatal编程技术网

Python 插入新记录时从另一个表插入到表中

Python 插入新记录时从另一个表插入到表中,python,sql,Python,Sql,我有两个表,如果记录不存在,我想将第一个表中的所有记录插入第二个表中。如果将新行添加到第一个表中,则必须将其插入第二个表中 我找到了这个查询 插入到表2中从不存在的表1中选择*,从表2中选择* 但如果在表1中添加新行,则该行不会插入表2中 PS:table1和table2具有相同的字段并包含数千条记录您可以在SQL中完成所有操作-例如,如果您可以每2分钟运行一次批处理 -- with these two tables and their contents ... DROP TABLE IF EX

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

我找到了这个查询 插入到表2中从不存在的表1中选择*,从表2中选择* 但如果在表1中添加新行,则该行不会插入表2中


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

您可以在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
);

所以这是一个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'.
因此,不支持合并

尝试其他东西:

INSERT INTO tableB
SELECT * FROM tableA
WHERE id <> ALL (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,然后运行插入。。。哪里不在或插入。。。我在哪里都

您是否正在寻找一种在Python中实现这一点的方法?因为这看起来像是MySQL/PostgreSQL/中的触发器作业……我正在使用python连接数据库,问题是我不知道将执行此操作的查询。我找到了这个解决方案:“插入到表2中,从不存在的表1中选择*,从表2中选择*,但如果向表1中添加了新记录,则不会将其插入表2中!!!您使用的是什么SQL数据库?Afaik触发器不是标准的SQL,所以它取决于您的数据库系统是否可以执行。我正在使用access databaselook-into触发器。这不是触发器。OP已经提到将表1的内容复制到表2。问题是他们想要一个触发器:每次将一行添加到表1时,都会主动地将该行添加到表2。最初的提问者没有提到触发器。并将第一个表中的所有记录插入第二个表中,如果这些记录不存在,实际上会导致我远离触发器。让我们等待提问者说什么……问题的最后一行是,如果在第一个表中添加了新行,则必须将其插入第二个表中。。你们怎么能不把它解释为一个触发器?@WillemVanOnsem是的,我想要的东西是,每当一行被添加到表中时,也会将该行添加到表2中。我不知道触发器是什么!!轮到你了,威廉
INSERT INTO tableB 
SELECT * FROM tableA a 
WHERE id=? 
  AND NOT EXISTS(
   SELECT * FROM tableB WHERE id=a.id
  );