我正在使用现有的表,我可以看到有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();
答案 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
提供