0

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

'FK_transactionmember' FOREGIN KEY ('MemberID') REFERENCES 'member' ('ID')

我创建外键约束女巫是一对多的关系(上图)。在这种情况下,交易必须需要成员 ID,但成员是可选的。

如何控制这种可选情况?

会员:

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
4

2 回答 2

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
于 2012-04-10T05:52:49.653 回答
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? .

于 2012-04-10T05:55:12.493 回答