我想在下面两个表之间创建一个可选的多个关系。
'FK_transactionmember' FOREGIN KEY ('MemberID') REFERENCES 'member' ('ID')
我创建外键约束女巫一对多关系(上图)。在这种情况下,事务必须是成员ID,但成员是可选的。
如何控制此可选情况?
Memebr:
CREATE TABLE `member` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`FirstName` varchar(30) DEFAULT NULL,
`LastName` varchar(30) DEFAULT NULL,
`PermanentAddress` varchar(100) DEFAULT NULL,
`TemporaryAddress` varchar(100) DEFAULT NULL,
`Zip` varchar(30) DEFAULT NULL,
`City` varchar(30) DEFAULT NULL,
`LastVisit` datetime DEFAULT NULL,
`TotalVisit` datetime DEFAULT NULL,
`Active` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
交易
CREATE TABLE `transaction` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`MemberID` int(11) DEFAULT '0',
`UserID` int(11) DEFAULT NULL,
`Total` float DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
答案 0 :(得分:1)
如果MemberID是可选的,则其默认值必须为null,而不是零。因此,如果不存在数据,则允许空值。
CREATE TABLE `transaction` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`MemberID` int(11) DEFAULT NULL,
`UserID` int(11) DEFAULT NULL,
`Total` float DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `FK_transactionmember` (`MemberID`),
CONSTRAINT `FK_transactionmember` FOREGIN KEY (`MemberID`) REFERENCES `member` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
) ENGINE=InnoDB DEFAULT CHARSET=latin1
答案 1 :(得分:1)
有(最后)两种方式创建如下表:
CREATE TABLE `transaction` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`MemberID` int(11) NULL,
`UserID` int(11) DEFAULT NULL,
`Total` float DEFAULT NULL,
PRIMARY KEY (`ID`),
CONSTRAINT 'FK_transactionmember'
FOREGIN KEY ('MemberID')
REFERENCES 'member' ('ID')
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
,只要您无法将其与成员连接,就将MemberID
设置为null
。在我看来这很好,但它不符合BNF要求或使用不同的表来链接两个表,如下所示:
CREATE TABLE `MemberTransactions` (
`MemberID` int(11) NULL,
`TransactionID` int(11) DEFAULT NULL,
CONSTRAINT 'FK_member'
FOREGIN KEY ('MemberID')
REFERENCES 'member' ('ID')
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT 'FK_transaction'
FOREGIN KEY ('TransactionID')
REFERENCES 'transaction' ('ID')
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
然后transaction
表没有MemberID
列。
已添加类似问题:Nullable Foreign Key bad practice?。