0

我想创建一个可选的许多关系,下面的两个表之间。一个可选许多关系

'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 

回答

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 
) 

,并设置MemberIDnull每当你不能与成员将其连接。这是在我看来不错,但它不符合要求的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?

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