我的问题是为什么我能够从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 |
+-------+---------------------------------------------------
答案 0 :(得分:2)
您正在使用的MyISAM存储引擎不会强制执行外键约束。如果您希望它们被强制执行,您应该使用另一个存储引擎,例如InnoDB。
对于不支持外键的存储引擎(,如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