带有3个主键的C#sql复制行

时间:2017-06-23 13:56:28

标签: c# sql linq

我正在使用现有的表,我可以看到有3个(!)主键: IANA database

我想复制现有的行,更改ctid列,然后将它们再次复制到表的末尾。我尝试了,我收到了错误:

  

无法使用已在使用的密钥添加实体。

可能是因为我正在复制行并使用相同的主键添加它们。我怎么能解决这个问题?是否有可能在不修改db模式的情况下解决它(我正在考虑将ctid添加为主键)?

代码

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();

2 个答案:

答案 0 :(得分:3)

您需要将ctid添加到复合主键。

ALTER TABLE TestUnits
DROP CONSTRAINT PK_WhateverYourCompositeIndexNameIs

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

请参阅:How can I alter a primary key constraint using SQL syntax?

答案 1 :(得分:0)

不,如果不修改db模式,就不可能做到这一点。由于您使用了三个 PK ,并且主键不能像您尝试的那样重复。您的问题的解决方案是使所有行的列唯一,然后添加另一行,但确保所有元组必须具有唯一条目。

您的问题的另一个解决方案已由 Rafalon

提供
相关问题