web-dev-qa-db-ja.com

重複せずにINTOを挿入

これをやりたい

INSERT INTO AdminAccounts (Name) 
SELECT Name
FROM Matrix 

しかし、私は複製を作成したくありません。つまり、これを数週間前に実行し、データを更新する必要があります。

6
AaronJAnderson
INSERT INTO AdminAccounts 
    (Name)
SELECT t1.name
  FROM Matrix t1
 WHERE NOT EXISTS(SELECT id
                    FROM AdminAccounts t2
                   WHERE t2.Name = t1.Name)
5
AaronJAnderson

これにより、以前にマトリックステーブルになかった新しい名前フィールドが挿入されます。

INSERT IGNORE
INTO AdminAccounts (Name) 
SELECT Name
FROM Matrix;

INSERT IGNOREを信頼しない場合は、新しいName値を挿入する前に明示できる別の方法があります。

CREATE TABLE NewName SELECT Name FROM Matrix WHERE 1=2;
INSERT INTO NewName
    SELECT Name FROM AdminAccounts A
    LEFT JOIN Matrix B USING (Name)
    WHERE B.Name IS NULL;
INSERT INTO Matrix (Name) SELECT Name FROM NewNames;

テーブルNewNameは、現在AdminAccountsにないMatrixのテーブルのみを収集します。これにより、新しい名前を確認できます。その後、NewNameのすべてをMatrixに挿入できます。

7
RolandoMySQLDBA

「AdminAccounts」の「name」フィールドを主キーまたは一意のインデックスにした場合、次のように使用できます

REPLACE INTO AdminAccounts (Name) 
SELECT Name
FROM Matrix 

したがって、テーブルに名前が存在しない場合は挿入されます。存在する場合は、古い行が削除され、新しい行が挿入されます。

0
cihat atsever