【发布时间】:2021-06-23 01:23:42
【问题描述】:
嘿嘿,
我有一个包含两列的表,parentServer 和appealServer。
两者都是VARCHAR(24)s,我的目标是在两列之间具有相互唯一性。
我目前的做法是在数据库中创建一个名为 dbam 的表;
USE dbam;
CREATE TABLE linkedservers (
parentServer varchar(24) NOT NULL,
appealServer varchar(24) NOT NULL,
PRIMARY KEY (parentServer ,appealServer),
UNIQUE KEY parentServer (parentServer ,appealServer),
CONSTRAINT CHK_Crosslink CHECK (parentServer <> appealServer or parentServer is null or appealServer is null)
)
但是这仍然允许appealServer 中的条目存在于parentSerevr 中,如下图所示,反之亦然。
我希望CHECK 约束在我将值插入表时触发
INSERT INTO linkedservers (parentServer,appealServer)
VALUES ('${supposedParent.id}','${supposedAppeal.id}')
话虽如此,有没有办法实现相互唯一性? 即第二列中的任何条目都不能存在于第一列中
如何重新创建这个;
样本数据;
855794220651380776
855794252025167872
856315856358342656
将其中两个id分别输入parentServer和appealServer,
INSERT INTO linkedservers (parentServer,appealServer)
VALUES ('855794220651380776','855794252025167872')
然后尝试将appealServer id 用作parentSerevr id,并为appealServer 使用新id
INSERT INTO linkedservers (parentServer,appealServer)
VALUES ('855794252025167872','856315856358342656')
【问题讨论】:
-
样本数据和期望的结果会有所帮助。对“相互唯一性”的明确解释也是可取的。
-
您不需要唯一索引,因为所有主键都是唯一的
-
你的意思是在整个表中是唯一的,还是在同一行中彼此不相等?
-
@Barmar 在整个表中
-
我认为这是不可能的。您需要使用
NOT EXISTS测试,但CHECK约束中不允许使用子查询。