检查约束参照其他表

时间:2019-11-18 15:40:41

标签: 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)]

我需要确保输入到Build中的处理器和主板具有相同的插槽。 由于“检查约束”无法引用其他值,因此我正在寻找替代方法。 我知道您可以为此使用UDF或Triggers,但是我是初学者,并且需要一些示例代码来帮助我。

谢谢。

1 个答案:

答案 0 :(得分:1)

不需要触发器。您可以使用外键约束来做到这一点。

  1. 在“处理器”上为“名称”和“套接字”两列添加一个唯一键。
  2. 在“主板”上为“名称”和“套接字”两列添加一个唯一键。
  3. 在Build中使您的FOREIGN KEY引用这两列。只给Build列一栏,即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引用ProcessorMotherboard中的套接字。 Build.Socket中给定行上只能有一个Build值。 因此,两个表中的套接字必须相同。