SQL服务器:多列键字典顺序
SQL Server : multiple column key lexicographical order
我在数据库中有两列设置为主键,比方说 Code1
和 Code2
。我使用 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
,如果不小于则“交换”值。
我在数据库中有两列设置为主键,比方说 Code1
和 Code2
。我使用 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
,如果不小于则“交换”值。