私は MySQL Server 5.5 を使用しています。MySQL ワークベンチ 5.2 CE; WinXp SP3; 2 つのテーブルを作成しました。
CREATE TABLE IF NOT EXISTS `mydb`.`Address` (
`AddressID` INT NOT NULL AUTO_INCREMENT ,
`Country` VARCHAR(45) NOT NULL ,
`City` VARCHAR(45) NOT NULL ,
`Region` VARCHAR(45) NOT NULL ,
`PostalCode` VARCHAR(12) NOT NULL ,
`Address1` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`AddressID`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Customers` (
`CustomerID` INT NOT NULL AUTO_INCREMENT ,
`FirstName` VARCHAR(45) NOT NULL ,
`LastName` VARCHAR(45) NOT NULL ,
`Email` VARCHAR(500) NOT NULL ,
`Password` VARCHAR(500) NOT NULL ,
`RegistrationDate` TIMESTAMP NULL ,
`CustomerCellPhone` VARCHAR(20) NULL ,
`AddressID` INT NULL ,
PRIMARY KEY (`CustomerID`) ,
INDEX `AddressID_idx` (`AddressID` ASC) ,
UNIQUE INDEX `Email_UNIQUE` (`Email` ASC) ,
CONSTRAINT `CustomerAddressID`
FOREIGN KEY (`AddressID` )
REFERENCES `mydb`.`Address` (`AddressID` )
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
基本的に、「顧客」テーブルには外部キー制約が含まれており、機能しません。理論的には、データを 2 つのテーブルに挿入すると、「Customers」がそれに依存するため、「Address」は削除されません。
insert into Address SET Country = 'Zimbabwe',
City = 'Harare',
Region = 'Mashonaland East Province',
PostalCode = '777',
Address1 = 'square 777 - 777';
insert into Customers SET FirstName = 'John',
LastName ='Doe',
Email = 'john@doe.com',
Password = '12345',
RegistrationDate = now(),
CustomerCellPhone = 123456789,
AddressID = 1;
「お客様」
CustomerID FirstName AddressID 1 John 1
'住所'
AddressID Country City 1 Zimbabwe Harare
ただし、次の方法で顧客の住所を削除できます。
DELETE FROM Address WHERE AddressID=1;
テーブル 'Customers' は何も参照していません (ダングリング ポインター)
CustomerID FirstName AddressID 1 John 1
空のテーブル「住所」
AddressID Country City --- --- ---
問題は、'Address'.AddressID = 1 が存在しないため、'Customers' が 'Address' に NULL を参照することです。エラーは発生しません。このバグを修復するにはどうすればよいですか?