【问题标题】:Creating a table with mutual uniqueness across multiple columns创建跨多个列具有相互唯一性的表
【发布时间】: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 约束中不允许使用子查询。

标签: mysql sql node.js


【解决方案1】:

您应该使用触发器进行此类检查。

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)
)
CREATE TRIGGER before_linkedservers_insert
BEFORE INSERT
ON linkedservers FOR EACH ROW
BEGIN

    IF  EXISTS(    SELECT 1
        FROM linkedservers

    WHERE appealServer = NEW.parentServer) THEN
        SIGNAL SQLSTATE '45000' 
            SET MESSAGE_TEXT = 'is aleady appleal server';
    END IF; 

END
INSERT INTO linkedservers (parentServer,appealServer) VALUES ('855794220651380776','855794252025167872')
INSERT INTO linkedservers (parentServer,appealServer) VALUES ('855794252025167872','856315856358342656')
是 aleady appleal 服务器

db小提琴here

【讨论】:

  • 这行得通,但是当尝试输入具有不唯一值的 parentServer 时,它会通过,我相信 UNIQUE KEY parentServer 应该已经停止,db<>fiddle
  • 是的,您定义了一个组合是唯一的,如果您只想要一个 parentServer,您必须单独定义它一个唯一的。
  • 啊,是的,我看到了@nbk,谢谢!
【解决方案2】:

只是一个想法,未经测试。有线设计,伪代码。

服务器,一个链接中不超过两台服务器

CREATE TABLE servers (
  Server varchar(24) NOT NULL,
  role int not null check role in (1,2),
  linkId int not null,
  PRIMARY KEY (Server),
  UNIQUE KEY lnk (link, role)
)

确保两个角色都存在。只有Goodlinks中的链接有效。

Create table Goodlinks(
  Linkid not null primary key,
  role1Id int not null check role1Id = 1 default 1,
  role2Id int not null check role2Id = 2 default 2,
  FK r1(Linkid,role1Id) references servers(linkid,role)
  FK r2(Linkid,role2Id) references servers(linkid,role)
)

goodLinks 中的一行可防止链接服务器被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2011-10-12
    • 2013-07-03
    • 2016-06-02
    • 1970-01-01
    • 2022-11-26
    • 2016-09-15
    相关资源
    最近更新 更多