Mariadb 检查引用其他表的约束

Mariadb 检查引用其他表的约束,mariadb,Mariadb,我有三张桌子 Processor with columns Name and Socket. Motherboard with columns Name and Socket. Build with columns Processor[references Processor(Name)] and Motherboard[references Motherboard(Name)] 我需要确保进入构建的处理器和主板具有相同的插槽。 由于检查约束不能引用其他值,因此我正在寻找替代方案。 我知道您可

我有三张桌子

Processor with columns Name and Socket.
Motherboard with columns Name and Socket.
Build with columns Processor[references Processor(Name)] and Motherboard[references Motherboard(Name)]
我需要确保进入构建的处理器和主板具有相同的插槽。 由于检查约束不能引用其他值,因此我正在寻找替代方案。 我知道您可以使用UDF或触发器来实现这一点,但我是初学者,希望一些示例代码能够帮助我


谢谢。

不需要触发器。可以使用外键约束执行此操作

  • 在处理器上为两列名称和套接字添加唯一键
  • 在主板上为“名称”和“套接字”两列添加唯一键
  • 使生成中的外键引用这两列。只给一个名为Socket的列进行构建。在两个外键中都使用它。因此,它必须是相同的

  • 下面是它的样子:

    CREATE TABLE `Processor` (
      `name` varchar(20) NOT NULL,
      `socket` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`name`),
      UNIQUE KEY `name` (`name`,`socket`)
    );
    
    CREATE TABLE `Motherboard` (
      `name` varchar(20) NOT NULL,
      `socket` varchar(20) DEFAULT NULL,
      PRIMARY KEY (`name`),
      UNIQUE KEY `name` (`name`,`socket`)
    );
    
    CREATE TABLE `Build` (
      `Processor` varchar(20) DEFAULT NULL,
      `Motherboard` varchar(20) DEFAULT NULL,
      `Socket` varchar(20) DEFAULT NULL,
      CONSTRAINT `build_ibfk_1` FOREIGN KEY (`Processor`, `Socket`)
        REFERENCES `processor` (`name`, `socket`),
      CONSTRAINT `build_ibfk_2` FOREIGN KEY (`Motherboard`, `Socket`)
        REFERENCES `Motherboard` (`name`, `socket`)
    );
    
    这将强制执行您想要的业务规则。外键要求
    Build.Socket
    引用
    处理器
    主板
    中的插槽。 在
    Build
    中的给定行上只能有一个
    Build.Socket
    值。
    因此,两个表中的套接字必须相同。

    请再次阅读我的问题。我请求帮助使用触发器实现约束。您使用的是什么版本的MySQL?我使用的是phpMyAdmin 4.9.1和MySQL版本10.4.8,这是一个MariaDB版本,而不是MySQL版本。您没有使用MySQL。这将不起作用。套接字不是主键。我有多个处理器和主板与同一个插座。你可以使外键引用任何唯一的键。您可以在两列
    Name
    Socket
    上创建一个唯一键。这将允许多个处理器具有相同的套接字,但前提是它们具有不同的名称。这就是多列唯一键的工作原理:只有当两列的值与另一行的值相同时,它们才是重复的。@BillKarwin啊,您的意思是复合键如何强制我对构建的约束?内置中添加的处理器和主板必须共享同一个套接字。在处理器表中,名称是唯一的(这是一个键),另外,组合名称+套接字也是唯一的。同样适用于桌面主板。在build表中,您也给出了套接字。这样做,处理器名+插槽被强制执行,主板+插槽也被强制执行