2017-06-23 2 views
0

ich auf einer vorhandenen Tabelle arbeite, wo ich es sehen können drei Primärschlüssel (!): enter image description hereC# SQL-Kopie Reihen mit 3 Primärschlüssel

Ich möchte die vorhandenen Zeilen kopieren, ändern, um die ctid Spalte und kopieren Sie sie dann erneut an das Ende der Tabelle. Ich versuche das und ich bekomme den Fehler:

Cannot add an entity with a key that is already in use.

Wahrscheinlich, weil ich die Zeilen kopiere und sie mit den gleichen Primärschlüsseln hinzufüge. Wie kann ich das lösen? Ist es möglich, es zu lösen, ohne das DB-Schema zu ändern (ich denke darüber hinaus, ctid als Primärschlüssel hinzuzufügen)?

-Code

var testsDefault = (from i in dc.TestUnits 
             where i.ctid == null 
             select i).ToList(); 

List<DAL.TestUnit> TestList = new List<DAL.TestUnit>(); 
        foreach (var test in testsDefault) 
        { 
         DAL.TestUnit newTest = new DAL.TestUnit(); 
         newTest.TestID = test.TestID; 
         newTest.PatientType = test.PatientType; 
         newTest.Unit = test.Unit; 
         newTest.ctid = "105"; 
         TestList.Add(newTest); 
        } 
        dc.TestUnits.InsertAllOnSubmit(TestList); 
        dc.SubmitChanges(); 
+0

Können Sie uns bitte Ihren Code zeigen, gegeben? – mjwills

+1

Das sind nicht 3 Schlüssel. Das ist ein Schlüssel, der sich über 3 Spalten erstreckt. –

+0

Mehrere Primärschlüssel nennen wir einen zusammengesetzten Schlüssel –

Antwort

3

Sie müssen ctid auf Ihre zusammengesetzten Primärschlüssel hinzuzufügen.

ALTER TABLE TestUnits 
DROP CONSTRAINT PK_WhateverYourCompositeIndexNameIs 

ALTER TABLE TestUnits 
ADD CONSTRAINT PK_WhateverYourCompositeIndexNameIs PRIMARY KEY (TestID, PatientType, Unit, ctid) 

See: How can I alter a primary key constraint using SQL syntax?

+0

kannst du mir sagen, wie ich das machen kann? – aggelos

+2

Beachten Sie auch, dass das Ändern des Primärschlüssels viele Auswirkungen haben kann, die Sie berücksichtigen müssen (z. B. wenn Ihr Code zuvor einen Datensatz von TestID/PatientType/Unit erwartet hat, erhält er jetzt 1 + N Datensätze)) ... Die Abfrageleistung könnte sich negativ ändern, Indizes/andere Abfragen müssen möglicherweise überdacht werden usw. – Trioj

+2

Auch ein 4-Spalten-Composite-Primärschlüssel, der ausschließlich aus Textspalten besteht, scheint mir suboptimal zu sein. Sie sollten auch das Refactoring in Betracht ziehen, um einen Ersatzschlüssel zu verwenden. – Trioj

0

Nein, es ist nicht möglich, was Sie ohne Änderung der Db-Schema zu tun versuchen. Da Sie drei verwenden PK und Primärschlüssel kann nicht doppelt sein, wie Sie es versuchen. Die Lösung für Ihr Problem besteht darin, alle Spalten der Zeile eindeutig zu machen und dann die andere Zeile hinzuzufügen, aber stellen Sie sicher, dass alle Tupel eindeutige Einträge haben müssen.

Das ist eine andere Lösung für Ihr Problem bereits von Rafalon

Verwandte Themen