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 作为组合唯一键以防止重复相同组合的行是个好主意