我在建立数据库表的时候,指定了外键约束,并且定义了级联删除语句
只要数据库服务MySql不重启动,那么级联就是好的
可是当我把MySQL的服务重新启动以后,再打开MySQL-front看,发现之前定义的cascade不见了
并且级联删除也不行了,失败。
删除数据时候,提示说外键约束,不能删除。
我就汗了,每次都是这样,于是我又重新用语句建表,刚刚建好的时候,删除数据是可以的,也就是说级联是好的
可是我又重启数据库服务MySQL,结果有不能级联删除了。晕了谁能帮我解决一下呢?
只要数据库服务MySql不重启动,那么级联就是好的
可是当我把MySQL的服务重新启动以后,再打开MySQL-front看,发现之前定义的cascade不见了
并且级联删除也不行了,失败。
删除数据时候,提示说外键约束,不能删除。
我就汗了,每次都是这样,于是我又重新用语句建表,刚刚建好的时候,删除数据是可以的,也就是说级联是好的
可是我又重启数据库服务MySQL,结果有不能级联删除了。晕了谁能帮我解决一下呢?
mysql的版本,你的表是什么存储引擎?
#
# 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。
能看出点什么来吗?
+--------------------+-------+
| 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
*************************** 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]
如果说你一启动起来默认为OFF, 则需要检查一下你的 my.ini 文件中有没有对这个变量进行设置这个变量是session 级的,你可以直接
set @@foreign_key_checks = 1;
打开。
我检查了变量设置,foreign_key_checks就是1啊。
可是当我重新启动服务了以后,级联又不见。
而且我找了所有的ini文件,都没有对foreign_key的设置。
谢谢你!