一到可选的很多关系

时间:2012-04-10 05:20:41

标签: mysql database relational-database constraints entity-relationship

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

'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

2 个答案:

答案 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?