新表复合主键的外键部分

3 mysql

我试过搜索负载,但我没有收到我的问题的具体答案。假设我有一个主键为 的表'A' Apk

Apk是表'B'中的外键。在表'B'中,我还有另一列Bcol

现在对于 'B' 我可以有一个由 'Bcol' 和 'Apk' 组成的复合主键PRIMARY KEY(Bcol, Apk)吗?是否可取?

小智 6

所以基本上你有这样的东西(除了我将你的 FK 表重命名为 C,因为它已经从其他地方拉了 B):

CREATE TABLE IF NOT EXISTS `table_a` (
  `apk` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`apk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `table_b` (
  `bcol` varchar(3) NOT NULL,
  `Location` varchar(20) NOT NULL,
  `Time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`bcol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `fk_table_c` (
  `apk` int(10) NOT NULL,
  `bcol` varchar(3) NOT NULL,
  `SomeOtherValue` varchar(20) NOT NULL,
  PRIMARY KEY (`apk`,`bcol`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `fk_table_c`
  ADD CONSTRAINT `fk_table_c_ibfk_2` FOREIGN KEY (`bcol`) REFERENCES `table_b` (`bcol`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_table_c_ibfk_1` FOREIGN KEY (`apk`) REFERENCES `table_a` (`apk`) ON DELETE CASCADE ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)

这是完全正常的,您将如何在 2 个实体之间形成多对多关系。您可能希望使用其他一些自动生成的唯一标识符作为主键,但将 2 个 FK 作为组合唯一键以防止重复相同组合的行是个好主意


小智 3

是的。这取决于您的情况和喜好。我喜欢让所有表都有单个/非复合主键。您可以在此处查看 SQL Fiddle 中的工作示例: http://sqlfiddle.com/#!2/b05df /1