【问题标题】:SQL Server : multiple column key lexicographical orderSQL Server:多列键字典顺序
【发布时间】:2021-06-11 20:15:03
【问题描述】:

我在数据库中有两列设置为主键,比如说Code1Code2。我使用 Entity Framework fluent api 来创建这样的密钥:

entity.HasKey(p => new { p.Code1, p.Code2 }).HasName("table_pkey");

我需要的是按字典顺序排列键。例如,当我在数据库中有记录时。

var code1 = "AA01";
var code2 = "AB01";
var pkey = "AA01AB01";

我尝试添加

var code1 = "AB01";
var code2 = "AA01";
var pkey = "AB01AA01";

我希望这被视为数据库的重复键,因此不允许添加它们。

感谢您的帮助

【问题讨论】:

    标签: sql-server .net-core entity-framework-core primary-key lexicographic-ordering


    【解决方案1】:

    'AA01AB01''AB01AA01' 彼此相等,因此您不能在此处强制违反主键。看来您在这里实际需要的是 2 个约束;首先保证Code1的值小于Code2,然后是主键约束。在 T-SQl 中,这将被定义为:

    CREATE TABLE dbo.YourTable (Code1 char(4) NOT NULL,
                                Code2 char(4) NOT NULL,
                                pkey AS Code1 + Code2 PERSISTED);
    GO
    ALTER TABLE dbo.YourTable ADD CONSTRAINT CK_CodeOrder CHECK (Code1 < Code2);
    GO
    ALTER TABLE dbo.YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY NONCLUSTERED (Pkey); --As this doesn't doesn't appear to be always ascending
    GO
    
    INSERT INTO dbo.YourTable (Code1,Code2)
    VALUES('AA01','AB01');
    GO
    INSERT INTO dbo.YourTable (Code1,Code2)
    VALUES('AB01','AA01'); --Fails as Code1 is greater than Code2
    GO
    

    在您的应用程序中,您可能希望检查 Code1 是否也小于 Code2,如果不是,则“交换”这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2015-04-07
      • 2017-03-25
      • 1970-01-01
      • 2019-07-08
      相关资源
      最近更新 更多