【问题标题】:C# sql copy rows with 3 primary keysC# sql 复制具有 3 个主键的行
【发布时间】:2017-06-23 13:56:28
【问题描述】:

我正在处理一个现有的表,我可以看到有 3(!) 个主键:

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

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

可能是因为我正在复制行并使用相同的主键添加它们。我该如何解决这个问题?是否可以在不修改数据库架构的情况下解决它(我也在考虑添加 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();

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 这不是 3 个键。这是一个分布在 3 列中的键。
  • 多个主键就是我们所说的复合键
  • 好吧不知道。我该如何克服这种情况?
  • 主键 - 复合与否 - 用于唯一标识一行。这意味着如果您知道键值,那么您就知道该行。您需要考虑您的对“哪些值是识别我的行的合适组合”的定义,然后相应地更改您的程序或表(甚至两者)。跨度>

标签: c# sql linq


【解决方案1】:

您需要将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?

【讨论】:

  • 你能告诉我怎么做吗?
  • 另外请注意,更改主键可能会产生您需要考虑的广泛影响(例如,如果您的代码之前希望通过 TestID/PatientType/Unit 获得一条记录,则可能现在正在获得 1+N 条记录)...查询性能可能会发生负面变化,索引/其他查询可能需要重新考虑,等等。
  • 另外,完全由文本列组成的 4 列复合主键对我来说似乎不是最理想的。您可能还需要考虑重构以使用代理键。
【解决方案2】:

不,如果不修改 db 架构,您将无法执行此操作。由于您使用三个 PK 并且主键不能像您尝试的那样重复。您的问题的解决方案是使所有行的列唯一,然后添加另一行,但确保所有元组都必须具有唯一的条目。

Rafalon

已经为您的问题提供了另一种解决方案

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 2020-03-09
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2010-10-24
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多