2017-06-20 56 views
0

我正在使用PHPMyAdmin(so mySQL)来创建它。SQL将b和b指向

我有2张表,专辑和照片。当然,一张照片可以是一张专辑的一部分,为此我使用从照片到专辑的外键。

但是现在我希望能够在专辑表中放置一张照片,这样我就可以使用该照片作为我的专辑的封面。我试着添加一个外键,但是这给了我一个外键约束。

下面是表格来帮助理解我的意思(foto = photo)。红线表示我想要达到的目标。

enter image description here

我不是那种善于SQL所以任何帮助表示赞赏。

SQL专辑:

CREATE TABLE `Albums` (
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Album_Naam` varchar(255) NOT NULL, 
`Aanmaakdatum` datetime NOT NULL, 
`FotoID` int(11) DEFAULT '1', 
PRIMARY KEY (`ID`), 
KEY `FotoID` (`FotoID`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 

SQL照片

CREATE TABLE `Foto` (
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Foto_Naam` varchar(255) NOT NULL, 
`AlbumID` int(11) DEFAULT NULL, 
PRIMARY KEY (`ID`), 
KEY `AlbumID` (`AlbumID`), 
CONSTRAINT `Foto_ibfk_1` FOREIGN KEY (`AlbumID`) REFERENCES `Albums` (`ID`) 
ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1 
+1

为什么不在照片表中添加一列'''tinyint(1)'''其中1 =专辑封面,否则为0。更好的是,用封面照片的关键字添加专栏。如果相关照片记录被删除,或者相册标识已更改为该照片,则可能需要一些触发器来清除该列。 –

+0

@SloanThrasher是的,我可以做到这一点。我的做法是错误的还是只是不好的做法? –

+1

您可以通过将“Albums.FotoID”设置为空值来使“专辑封面”可选;允许你插入一个空白的专辑,然后将其引用设置为“封面”。 (就我个人而言,我会远离照片上的“封面旗帜”;这不是一个可怕的想法或任何事情,只是不热衷于无法约束的旗帜领域的想法。) – Uueerdo

回答

1

外键可以进行通过使参照场可空可选;该字段中的NULL值不会违反对其执行的外键约束。这可以用来表示纯粹的可选关系,或者像这个问题一样,推迟在半循环依赖关系中设置值。

请注意,要从相册中移除封面照片,该相册首先需要将该照片设置为其他照片的封面引用,或者为null。同样,要删除相册,您需要删除它的Foto s,因此首先将其设置为空。

+0

编辑该问题以表明它可以为空。 –

+1

如果Foto.ID 1尚不存在,您将其默认为“1”的事实可能会导致您一些问题。我相信当您尝试插入NULL或忽略插入字段时,MySQL使用默认值。 – Uueerdo

+0

确实解决了这个问题,谢谢! –