SQL服务器:多列键字典顺序

SQL Server : multiple column key lexicographical order

我在数据库中有两列设置为主键,比方说 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";

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

感谢您的帮助

'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,如果不小于则“交换”值。