2016-08-31 1 views
0

Kürzlich musste ich eine Reihe von realen Daten aus meinem früheren Projekt zu Demonstrationszwecken verwenden. Während die meisten Daten real sind, müssen persönliche Informationen wie Name und E-Mail durch zufällig generierte Daten ersetzt werden. Ich habe bereits einige Tausend Namen und E-Mails erhalten, die durch die Verwendung von Diensten wie mockaroo generiert wurden.gibt es einen SQL-Befehl, um große Anzahl von Zeilen nach ID zu aktualisieren?

Gibt es eine Möglichkeit, diese Daten schnell mit SQL einzufügen? Da ich andere Daten behalten muss, kann ich nur die 2 Felder aktualisieren, anstatt neue Zeilen einzufügen. Ich habe ein ID-Feld als Primärschlüssel, aber es ist nicht aufeinanderfolgend, weil die tatsächlich verwendeten Zeilen gelöscht werden. Am besten wäre es (aber nicht muss), wenn es in diesem Format ist:

Some SQL UPDATE statement 
("Russell Dixon", "[email protected]"), 
("Todd Gonzales", "[email protected]"), 
("Roger Green", "[email protected]"), 
......... 
("Jason Anderson", "[email protected]"), 
("Gloria Larson", "[email protected]"), 
("Eric Bishop", "[email protected]") 
Some SQL statment or empty 
+0

Welche RDBMS verwenden Sie? –

+0

Können Sie nicht einfach mehrere UPDATE-Anweisungen verwenden? –

+0

Mögliches Duplikat von [Mehrere Zeilen in mysql einfügen] (http://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql) –

Antwort

0

Try this:

UPDATE table 
    SET email = CASE 
         WHEN ID = 1 THEN "[email protected]" 
         etc.... 
       END 

Edit: Ich lese Ihre Frage nur und denke, was Sie brauchen, ist nur eine Masse einfügen:

INSERT INTO table (Column1, Column2) VALUES 
(Value1, Value2), (Value1, Value2) 
+0

In der Frage, "Russell Dixon" ist der neue Name aktualisiert werden. Es ist nicht in den Originaldaten vorhanden. – cytsunny

+0

er möchte ein Massenupdate, nicht einfügen –

0

Möglicher Weg, es zu tun: -

INSERT INTO some_table(ID, name, email) 
SELECT sub1.ID, sub3.aName, sub3.aEmail 
FROM 
(
    SELECT ID, @seq1:[email protected] + 1 AS seq 
    FROM some_table 
    CROSS JOIN (SELECT @seq1 := 0) sub0 
) sub1 
INNER JOIN 
(
    SELECT aName, aEmail, @seq2:[email protected] + 1 AS seq 
    FROM 
    (
     SELECT "Russell Dixon" AS aName, "[email protected]" AS aEmail 
     UNION SELECT "Todd Gonzales", "[email protected]" 
     UNION SELECT "Roger Green", "[email protected]" 
     UNION SELECT "Jason Anderson", "[email protected]" 
     UNION SELECT "Gloria Larson", "[email protected]" 
     UNION SELECT "Eric Bishop", "[email protected]" 
    ) sub2 
    CROSS JOIN (SELECT @seq2 := 0) sub3 
) sub3 
ON sub1.seq = sub3.seq 
ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email); 

Dies ist die Auswahl aller Datensätze aus Ihrer vorhandenen Tabelle und das Hinzufügen einer Sequenznummer sowie das Abrufen aller Aktualisierungsnamen und das Hinzufügen einer Sequenznummer. Dann werden die Datensätze mit der übereinstimmenden Sequenznummer verknüpft und als Quelle für eine Einfügung verwendet. ON DUPLICATE KEY UPDATE wird für das Update verwendet, sodass die Datensätze mit dem Namen und der E-Mail-Adresse der Änderungen aktualisiert werden.

Wenn Sie dies mit vielen Datensätzen machen, ist es wahrscheinlich einfacher, die Namen und E-Mail-Adressen in eine Tabelle einzufügen und dann aus dieser auszuwählen, anstatt Konstanten auszuwählen.

0

Sie können zwei temporäre Tabellen mit automatisch inkrementellen Spalten erstellen. Sie können sie dann mithilfe dieser Auto-Increment-Spalten verknüpfen.

create temporary table tmp_userids (
    row_nr int auto_increment primary key, 
    user_id int 
) 
    select null as row_nr, id as user_id 
    from users 
; 

create temporary table tmp_fakedata (
    row_nr int auto_increment primary key, 
    name varchar(50), 
    email varchar(50) 
); 

insert into tmp_fakedata(name, email) values 
    ("Russell Dixon", "[email protected]"), 
    -- ........ 
    ("Eric Bishop", "[email protected]") 
; 

update user u 
join tmp_user_ids i on i.user_id = u.id 
join tmp_fakedata f on f.row_nr = i.row_nr 
set u.name = f.name, 
    u.email = f.email 
Verwandte Themen