2014-10-15 3 views
1

내 질문에 왜 나는 emp 테이블에 해당 레코드가있는 dept 테이블에서 레코드를 삭제할 수 있습니다.mysql이 외래 키가 참조하는 레코드를 삭제할 수있는 이유는 무엇입니까?

예를 들어, deptno = 10 인 레코드를 삭제할 수 있습니다. 반면 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

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

카스티하십시오 : InnoDB는 실행, InnoDB하지만 당신의 설정에서 사용할 수있는 경우 쿼리를 결정하기 위해, MySQL은 5.5부터 기본 스토리지 엔진이다 당신이 묻고있는 것을 성찰하십시오. 귀하의 질문을 이해할 수 없습니다. – cybermonkey

+1

InnoDB 엔진을 사용하고 있습니까? myISAM은 외래 키 제약을 적용하지 않는다. –

+0

만약 내가 deptno에있는 레코드를 삭제할 수 있다면, 해당 레코드의 emp 테이블에는 가치가 없다. – Pawan

답변

2

MyISAM 스토리지 엔진은 외래 키 선언을 허용하지만 제약 조건은 적용하지 않습니다. 외래 키 무결성을 보장 할 수 있도록, 당신은 세계적으로 MySQL의 설정 파일 my.cnf이를 지정하여 InnoDB 엔진으로 전환 할 수 있습니다 테이블을 데이터베이스에서 로컬

[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; 

참고 : SHOW ENGINES

2

당신이 외래 키 제약 조건을 적용하지 않는 사용중인의 MyISAM 스토리지 엔진을 내 공연 테이블 구조입니다. 강제로 실행하려면 InnoDB와 같은 다른 스토리지 엔진을 사용해야합니다. 외래 키를 지원하지 않는 스토리지 엔진에 대한

(의 MyISAM로 등), MySQL 서버의 구문 분석 및 외래 키 사양을 무시 :

documentation을 인용합니다.

관련 문제