为什么mysql允许删除外键引用的记录?

时间:2014-10-15 11:34:39

标签: mysql foreign-keys

我的问题是为什么我能够从dept表中删除记录,这些记录在emp表中有相应的记录。

例如,我可以删除deptno = 10的dept表中的记录,而emp表中的记录使用外键引用该记录。

mysql> select * from emp;
+-------+-------+---------+------+----------+------+------+--------+
| empno | ename | job     | mgr  | hiredate | sal  | comm | deptno |
+-------+-------+---------+------+----------+------+------+--------+
|  7698 | BLAKE | MANAGER | 7839 | NULL     | 2850 | NULL |     30 |
|  7782 | CLARK | MANAGER | 7839 | NULL     | 2450 | NULL |     10 |
+-------+-------+---------+------+----------+------+------+--------+
2 rows in set (0.00 sec)

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)


mysql> delete from dept where deptno = 10;
Query OK, 1 row affected (0.00 sec)

这是我的表结构

CREATE TABLE dept( deptno int, dname varchar(14), loc varchar(13), PRIMARY KEY (deptno));

CREATE TABLE emp( empno int, ename varchar(10), job varchar(9), mgr int, hiredate date, sal int, comm int, deptno int, PRIMARY KEY (empno),FOREIGN KEY (deptno) REFERENCES dept (deptno));

INSERT INTO dept VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES(20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES(30,'SALES','CHICAGO');
INSERT INTO dept VALUES(40,'OPERATIONS','BOSTON');


INSERT INTO emp
VALUES( 7698,
        'BLAKE',
        'MANAGER',
        7839,
        STR_TO_DATE('1-5-1981','dd-mm-yyyy'),
        2850,
        NULL,
        30);


INSERT INTO emp
VALUES( 7782,
        'CLARK',
        'MANAGER',
        7839,
        STR_TO_DATE('9-6-1981','dd-mm-yyyy'),
        2450,
        NULL,
        10);

提前致谢。

这是我的emp

的show table结构
mysql> show create table dept;
+-------+---------------------------------------------------
| Table | Create Table
+-------+---------------------------------------------------
| dept  | CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL DEFAULT '0',
  `dname` varchar(14) DEFAULT NULL,
  `loc` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------

2 个答案:

答案 0 :(得分:2)

您正在使用的MyISAM存储引擎不会强制执行外键约束。如果您希望它们被强制执行,您应该使用另一个存储引擎,例如InnoDB。

引用documentation

  

对于不支持外键的存储引擎(,如MyISAM ),MySQL Server会解析并忽略外键规范。

答案 1 :(得分:2)

MyISAM存储引擎将接受外键声明,但不会强制执行约束;为了能够保证外键完整性,您可以切换到InnoDB引擎,在mysql配置文件my.cnf中全局指定它:

 [mysqld]
 ...
 default-storage-engine=InnoDB

或在数据库本地,删除表,然后使用完整的mysql特定语法重新添加它们,如:

 CREATE TABLE `dept` (
  `deptno` int(11) NOT NULL DEFAULT '0',
  `dname` varchar(14) DEFAULT NULL,
  `loc` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`deptno`)
) ENGINE=INNODB DEFAULT CHARSET=latin1;

注意:InnoDB是自Mysql 5.5以来的默认存储引擎,用于确定InnoDB是否在您的设置中可用,执行查询:SHOW ENGINES