簡體   English   中英

當插入新記錄時,從另一個表插入一個表

[英]insert into a table from another table when a new record is inserted

我有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

要么:

-- 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 ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM