MySQL,引用完整性不';行不通

MySQL,引用完整性不';行不通,mysql,referential-integrity,Mysql,Referential Integrity,我使用MySQL服务器5.5;MySQL工作台5.2 CE;winxpsp3; 我创建了两个表: 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 , `Postal

我使用MySQL服务器5.5;MySQL工作台5.2 CE;winxpsp3; 我创建了两个表:

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;
基本上,表“Customers”包含外键约束,它不起作用。 理论上,如果我将数据插入两个表中,我不会删除“Address”,因为“Customers”依赖于它:

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;
“客户”

“地址”

但是,我可以通过以下方式删除客户的地址:

DELETE FROM Address WHERE AddressID=1;
表“Customers”未提及任何内容(悬空指针)

空表“地址”


问题是“客户”将NULL引用到“地址”中,因为“地址”.AddressID=1不存在。它没有给我任何错误。我能做些什么来修复这个错误?

Phew,重新启动MySQL服务器对我有帮助。

Phew,重新启动MySQL服务器对我有帮助。

你有什么版本的MySQL?如果你想限制删除,只需将删除限制上的
替换为删除级联上的
;只需检查外键是否具有DELETE-rule-RESTRICT,而不是设置为NULL。而且,奇怪的是,所有字段值都变为空。有什么触发器可以做到这一点吗?只是替换关键字对我没有帮助。关键是MySQL允许我删除引用另一个表的数据-这是不对的。@Devart,是的,我不使用任何触发器并设置“on delete restrict”。我还尝试实现了在我的计算机上不起作用的基本教程:你有什么版本的MySQL?只要将删除限制上的
替换为删除级联上的
,如果你想限制删除-使用删除限制;只需检查外键是否具有DELETE-rule-RESTRICT,而不是设置为NULL。而且,奇怪的是,所有字段值都变为空。有什么触发器可以做到这一点吗?只是替换关键字对我没有帮助。关键是MySQL允许我删除引用另一个表的数据-这是不对的。@Devart,是的,我不使用任何触发器并设置“on delete restrict”。我还尝试实施在我的计算机上不起作用的基本教程:
AddressID         Country          City   
1                 Zimbabwe         Harare
DELETE FROM Address WHERE AddressID=1;
CustomerID        FirstName       AddressID
1                 John            1 
AddressID         Country         City    
---               ---             ---