2017-06-20 4 views
0

私はこれを作成するためにPHPMyAdmin(mySQL)を使用しています。SQLはbとbをaに参照します

私は2つのテーブル、アルバムと写真があります。もちろん、写真はアルバムの一部とすることができ、そのために写真からアルバムへの外部キーを使用します。

今、アルバムの表に写真を置いて、その写真をアルバムの表紙として使用できるようにしたいと考えています。私は外部キーを追加しようとしましたが、それは私に外部キー制約を与えます。

ここには、私が何を意味するのかを理解するための表があります(写真=写真)。赤い線は私が達成したいことを示しています。

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にしてください。さらに、カバー写真のキーを使ってアルバムにコラムを追加してください。関連する写真の記録が削除された場合、またはその写真のアルバムIDが変更された場合は、その列を消去するトリガーを2つ設定することができます。 –

+0

@SloanThrasherそうですね。私のやり方は間違っているのか悪いのか? –

+1

'Albums.FotoID'をnullにすることで、" album cover "をオプションにすることができます。空のアルバムを挿入し、後で「カバー」への参照を設定することができます。 (個人的には、私は写真上の「カバーフラッグ」から遠ざかります;恐ろしいアイデアではなく、拘束できないフラッグフィールドのアイデアを熱望していません)。 – Uueerdo

答えて

1

外部キーが参照フィールドのNULL可能にすることによって、オプション行うことができます。フィールド内のNULL値は、フィールドに適用される外部キー制約に違反しません。これは純粋に任意の関係を表すために、あるいはこの質問の場合のように、半周期依存性の値を設定するのを延期するために使用できます。

アルバムからカバー写真を削除するには、アルバムの写真の参照先を別の写真に設定するか、nullにする必要があります。同様に、アルバムを削除するには、アルバムを削除する必要があります(Foto)ので、まずそのカバーをnullに設定します。

+0

nullableであることを示すために質問を編集しました。 –

+1

Foto.ID 1がまだ存在しない場合は、デフォルトで '1'に設定されています。私はNULLを挿入しようとすると、MySQLがデフォルト値を使うとか、フィールドを無視して挿入すると信じています。 – Uueerdo

+0

確かにそれは問題のおかげで解決! –

関連する問題