我在建立数据库表的时候,指定了外键约束,并且定义了级联删除语句
只要数据库服务MySql不重启动,那么级联就是好的
可是当我把MySQL的服务重新启动以后,再打开MySQL-front看,发现之前定义的cascade不见了
并且级联删除也不行了,失败。
删除数据时候,提示说外键约束,不能删除。
我就汗了,每次都是这样,于是我又重新用语句建表,刚刚建好的时候,删除数据是可以的,也就是说级联是好的
可是我又重启数据库服务MySQL,结果有不能级联删除了。晕了谁能帮我解决一下呢?

解决方案 »

  1.   

    提供一下你的create table 的SQL语句及测试用例。 
    mysql的版本,你的表是什么存储引擎?
      

  2.   


    #
    # Table structure for table t_system_administrator
    #
    DROP TABLE IF EXISTS `t_system_administrator`;
    CREATE TABLE `t_system_administrator` (
      `Sa_Id` int(11) NOT NULL AUTO_INCREMENT,
      `Username` varchar(20) NOT NULL DEFAULT '',
      `Password` varchar(50) NOT NULL DEFAULT '',
      `Name` varchar(20) NOT NULL DEFAULT '',
      `Sex` char(2) DEFAULT NULL,
      `Age` int(3) DEFAULT NULL,
      `Birth_Date` date DEFAULT NULL,
      `Address` varchar(70) DEFAULT NULL,
      `email` varchar(35) DEFAULT NULL,
      PRIMARY KEY (`Sa_Id`),
      UNIQUE KEY `Username` (`Username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    #
    # Table structure for table t_supervisor
    #DROP TABLE IF EXISTS `t_supervisor`;
    CREATE TABLE `t_supervisor` (
      `S_Id` int(11) NOT NULL AUTO_INCREMENT,
      `Username` varchar(20) NOT NULL DEFAULT '',
      `Password` varchar(50) NOT NULL DEFAULT '',
      `Name` varchar(20) NOT NULL DEFAULT '',
      `Sex` char(2) DEFAULT NULL,
      `Age` int(3) DEFAULT NULL,
      `Birth_Date` date DEFAULT NULL,
      `Address` varchar(70) DEFAULT NULL,
      `Sa_Id` int(11) DEFAULT NULL,
      `email` varchar(35) DEFAULT NULL,
      PRIMARY KEY (`S_Id`),
      UNIQUE KEY `Username` (`Username`),
      KEY `Sa_Id` (`Sa_Id`),
      CONSTRAINT `t_supervisorfk_1` FOREIGN KEY (`Sa_Id`) REFERENCES `t_system_administrator` (`Sa_Id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;比如上面的两张表吧,一个管理员表,一个主管表。管理员和主管之间是一对多关系,所以在主管表中定义一个外键约束,并且定义级联删除。
    我用的数据库是MySql 5.20。
    能看出点什么来吗?
      

  3.   

    检查一下你的 foreign_key_checks 系统变量。mysql> show variables like 'foreign_key_checks';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | foreign_key_checks | ON    |
    +--------------------+-------+
    1 row in set (0.00 sec)mysql>
    1。 确认你的表的存储引擎是InnoDB
    2。确认你表中的  CONSTRAINT `tb_ibfk_1` FOREIGN KEY (`ida`) REFERENCES `ta` (`ida`) ON DELETE CASCADE
    3。确认系统变量设置foreign_key_checks为ON
      

  4.   

    用你的表做了下测试。重启MySQL服务前后均正常。[code=BatchFile]mysql> show create table t_system_administrator \G
    *************************** 1. row ***************************
           Table: t_system_administrator
    Create Table: CREATE TABLE `t_system_administrator` (
      `Sa_Id` int(11) NOT NULL AUTO_INCREMENT,
      `Username` varchar(20) NOT NULL DEFAULT '',
      `Password` varchar(50) NOT NULL DEFAULT '',
      `Name` varchar(20) NOT NULL DEFAULT '',
      `Sex` char(2) DEFAULT NULL,
      `Age` int(3) DEFAULT NULL,
      `Birth_Date` date DEFAULT NULL,
      `Address` varchar(70) DEFAULT NULL,
      `email` varchar(35) DEFAULT NULL,
      PRIMARY KEY (`Sa_Id`),
      UNIQUE KEY `Username` (`Username`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)mysql> show create table t_supervisor \G
    *************************** 1. row ***************************
           Table: t_supervisor
    Create Table: CREATE TABLE `t_supervisor` (
      `S_Id` int(11) NOT NULL AUTO_INCREMENT,
      `Username` varchar(20) NOT NULL DEFAULT '',
      `Password` varchar(50) NOT NULL DEFAULT '',
      `Name` varchar(20) NOT NULL DEFAULT '',
      `Sex` char(2) DEFAULT NULL,
      `Age` int(3) DEFAULT NULL,
      `Birth_Date` date DEFAULT NULL,
      `Address` varchar(70) DEFAULT NULL,
      `Sa_Id` int(11) DEFAULT NULL,
      `email` varchar(35) DEFAULT NULL,
      PRIMARY KEY (`S_Id`),
      UNIQUE KEY `Username` (`Username`),
      KEY `Sa_Id` (`Sa_Id`),
      CONSTRAINT `t_supervisorfk_1` FOREIGN KEY (`Sa_Id`) REFERENCES `t_system_admin
    istrator` (`Sa_Id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)mysql> select Sa_Id,Username from t_system_administrator;
    +-------+----------+
    | Sa_Id | Username |
    +-------+----------+
    |     1 | AAAA     |
    |     2 | BBBB     |
    |     3 | CCCC     |
    +-------+----------+
    3 rows in set (0.00 sec)mysql> select S_Id,Username,Sa_Id from t_supervisor;
    +------+----------+-------+
    | S_Id | Username | Sa_Id |
    +------+----------+-------+
    |    1 | SAAAA    |     1 |
    |    2 | SBBBB    |     2 |
    |    3 | SCCCC    |     3 |
    +------+----------+-------+
    3 rows in set (0.01 sec)mysql> show variables like 'foreign_key_checks';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | foreign_key_checks | ON    |
    +--------------------+-------+
    1 row in set (0.00 sec)mysql> delete from t_system_administrator where Sa_Id=2;
    Query OK, 1 row affected (0.06 sec)mysql> select Sa_Id,Username from t_system_administrator;
    +-------+----------+
    | Sa_Id | Username |
    +-------+----------+
    |     1 | AAAA     |
    |     3 | CCCC     |
    +-------+----------+
    2 rows in set (0.00 sec)mysql> select S_Id,Username,Sa_Id from t_supervisor;
    +------+----------+-------+
    | S_Id | Username | Sa_Id |
    +------+----------+-------+
    |    1 | SAAAA    |     1 |
    |    3 | SCCCC    |     3 |
    +------+----------+-------+
    2 rows in set (0.00 sec)mysql>C:\Program Files\MySQL\MySQL Server 5.1\bin>mysql -u root -p123 test
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.1.33-community-log MySQL Community Server (GPL)Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> delete from t_system_administrator where Sa_Id=3;
    Query OK, 1 row affected (0.08 sec)mysql> select Sa_Id,Username from t_system_administrator;
    +-------+----------+
    | Sa_Id | Username |
    +-------+----------+
    |     1 | AAAA     |
    +-------+----------+
    1 row in set (0.00 sec)mysql> select S_Id,Username,Sa_Id from t_supervisor;
    +------+----------+-------+
    | S_Id | Username | Sa_Id |
    +------+----------+-------+
    |    1 | SAAAA    |     1 |
    +------+----------+-------+
    1 row in set (0.00 sec)mysql>[/code]
      

  5.   

    非常感谢你,但是我用这样的方法检查foreign_key_checks 系统变量,结果是空的,怎么设置啊?
      

  6.   

    也就是说,如何系统变量设置foreign_key_checks为ON呢?我的好像就是OFF。
      

  7.   

    这个系统变量的默认设置是 ON 啊。
    如果说你一启动起来默认为OFF, 则需要检查一下你的 my.ini 文件中有没有对这个变量进行设置这个变量是session 级的,你可以直接
    set @@foreign_key_checks = 1; 
    打开。
      

  8.   

    啊!我要崩溃了,我都重新安装数据库了,还是这样!
    我检查了变量设置,foreign_key_checks就是1啊。
    可是当我重新启动服务了以后,级联又不见。 
    而且我找了所有的ini文件,都没有对foreign_key的设置。
      

  9.   

    多谢你一直帮助我。我换了其他版本的数据库(MySQL的其他版本),折腾到现在,总算好了。
    谢谢你!