2016-11-27 2 views
1

Ich habe mehrere Datendateien wie folgt aus:PHP PDO TRY. Umgang mit Dubletten

- table 1  - table 2  - table 3 
id  val  id val  id val 
============  ==========  =========== 
    1 one   1 uno   1 un 
    2 two   4 dos   6 deux 
    3 three  5 tres  7 trois 

ich sie in einer Datenbank einzufügen bin versucht erwarten:

= result table 
    id val 
    ============ 
    1 one 
    2 two 
    3 three 
    d1 uno 
    4 dos 
    5 tres 
    dd1 un 
    6 deux 
    7 trois 

Die Datenbankstruktur ist:

= sqlite database file: data.db 
    CREATE TABLE register (
     id VARCHAR(3) PRIMARY KEY, 
     val VARCHAR(16) 
); 

Ich bin mit dieser Art von Lösung gekommen:

<?php 
$table1 = array("1"=>"one","2"=>"two","3"=>"three"); 
$table2 = array("1"=>"uno","4"=>"dos","5"=>"tres"); 
$table3 = array("1"=>"un","6"=>"deux","7"=>"trois"); 

$fileHandle = new PDO("sqlite:data.db"); 
$fileHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

foreach($table1 as $key => $value){ 
    try{ 
    $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('".$key."', '".$value."');"); 

    }catch(PDOException $e){ 
    if($e->getCode()=='23000'){ // if key exists, add a "d" to differentiate 
     $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('d".$key."', '".$value."');"); 
    } 
    } 
} 
// keys: 1, 2, 3 

foreach($table2 as $key => $value){ 
    try{ 
    $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('".$key."','".$value."');"); 
    }catch(PDOException $e){ 
    if($e->getCode()=='23000'){ // if key exists, add a "d" to differentiate 
     $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('d".$key."', '".$value."');"); 
    } 
    } 
} 
// keys: 1, 2, 3, d1, 4, 5 

foreach($table3 as $key => $value){ 
    try{ 
    $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('".$key."', '".$value."');"); 
    }catch(PDOException $e){ 
    echo " getCode   : ".$e->getMessage()."\n"; 
    if($e->getCode()=='23000'){ // if key exists, add a "d" to differentiate 
     $fileHandle->exec("INSERT INTO `register` (id,val) VALUES ('d".$key."', '".$value."');"); 
    } 
    } 
} 
// Signals error on the INSERT in the CATCH body 

?> 

Aber stecken auf dem zweiten Auftreten eines Schlüssels. Generieren eines doppelten Schlüssels (d1) im Beispiel

Ich kann das sich wiederholende Muster sehen, aber ich sehe nicht, wie man es kondensiert. Oder wiederholen Sie den geänderten Schlüssel.

Vielen Dank im Voraus für Ihre Eingabe.

+0

Versuchen, meine Frage zu konzentrieren. Keine der Strukturen kann geändert werden; Die Daten und die Datenbank existieren bereits (mit Tausenden von Datensätzen). Das Ziel ist, doppelte IDs einzufügen (welche Einschränkungen verhindern), indem man sie ein bisschen ändert. Wenn wir also drei Datensätze mit derselben ID 1, 1, 1 haben, würden sie in die Datenbank als 1, d1, dd1 einfügen. –

Antwort

0

Sie erhalten einen Fehler, weil Sie register.id Feld als Primärschlüssel eingerichtet, die eindeutige Einschränkung und ID in Ihren Tabellen mit Daten enthält nicht eindeutig sind. Wenn Sie id Werte aus Tabellen benötigen, aus denen Sie Daten erhalten, besteht eine typische Lösung darin, ein separates id-Feld mit Integer-Typ mit Autoinkrement als Primärschlüssel zu erstellen und ein anderes Feld zu erstellen. Beispiel data_tables_id, in dem Sie den Wert id aus Tabellen speichern von. So wird Ihre SQL für register Tabelle sein:

CREATE TABLE register (
    id Integer PRIMARY KEY AUTOINCREMENT, 
    data_table_id VARCHAR(3) PRIMARY KEY, 
    val VARCHAR(16) 

);

und geben Sie Ihre Daten wie folgt:

"INSERT INTO `register` (data_table_id,val) VALUES ('$key','$value'); 
0

Ich denke, dass Sie benötigen Arrays zu ändern. Sie können den gleichen Wert der ID nicht hinzufügen, wenn dieser eindeutig sein muss. Im Ergebnis Sie wollen einen Wert von id wie 'dd1' und 'd1', aber in Arrays Sie haben Werte auf '1' gesetzt.